一个简单的struts实例
struts应该算是java比较经典和古典的一个MVC架构,目前的版本头还是2;它所解决的问题是接收客户端请求并通过控制器control给后台model,后台拿到结果后,再通过相应的视图view反应给客户端。支持AOP编程。
学习使用struts这种mvc架构的一个简单实例:
1、基础架构搭建
maven项目类型选webapp;后面我们用jsp来做客户端视图。
pom.xml如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- convention-plugin插件,使用了这个插件之后,就可以采用注解的方式配置Action -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.20</version>
</dependency>
<!--config-browser-plugin插件,使用了这个插件之后,就可以很方便的浏览项目中的所有action及其与 jsp view的映射-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-config-browser-plugin</artifactId>
<version>2.3.20</version>
</dependency>
</dependencies>
项目结构如下,没有的自己创建folder。主要是src/main/java和src/main/resources和webapp/web-inf;
web.xml和struts.xml顾名思义都是项目配置文件;web.xml面向客户端请求-control层前方,主要是定义struts过滤器和拦截器等,struts.xml主要是面向control层后方,定义常用的strusts结构属性和action;使用开源架构就必须要做点功课,能熟练得遵守架构约定就算是成功了。
web.xml
<!-- add struts2 filterdispatcher,原来的过滤器如org.apache.struts2.dispatcher.FilterDispatcher过时了 -->
<filter>
<description>配置struts2的核心过滤器</description>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml 定义struts属性,暂时没有深究
<struts>
<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 文件上传最大值 -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Action名称中是否还是用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 允许标签中使用表达式语法 -->
<constant name="struts.tag.altSyntax" value="true" />
<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
<constant name="struts.dispatcher.parametersWorkaround" value="false" />
</struts>
2、创建实例
用jsp作为视图来创建一个struts实例,检验一下成果:用户在客户端输入loginname=ETC pwd=123则通过,进入welcome页面,否则不通过,提留在原页面:
首先是action类:struts约定的控制层后台方法调度器:
package com.nick.mystruts.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import com.nick.mystruts.model.LoginService;
//使用convention插件提供的@Action注解将一个普通Java类标识为可以处理用户请求的Action类
@Action
//使用使用convention插件提供的@Namespace注解指明这个Action类的命名空间
@Namespace("/")
public class LoginAction {
private String loginName;
private String pwd;
public void test(){
System.out.println("调用了TestAction里面的test方法");
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String execute(){
LoginService service=new LoginService();
boolean flag=service.login(loginName, pwd);
if (flag){
return "success";
}
return "fail";
}
}
在struts.xml中配置action:
<package name="basePackage" extends="struts-default">
<action name = "Login" class="com.nick.mystruts.action.LoginAction">
<result name="success">welcome.jsp</result>
<result name="fail">index.jsp</result>
</action>
</package>
其次是service层:
package com.nick.mystruts.model;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
//使用convention插件提供的@Action注解将一个普通Java类标识为可以处理用户请求的Action类
@Action
//使用使用convention插件提供的@Namespace注解指明这个Action类的命名空间
@Namespace("/")
public class LoginService {
public boolean login(String loginName,String pwd){
if ("ETC".equals(loginName)&&"123".equals(pwd)){
return true;
}
return false;
}
}
创建一个index.jsp来响应客户请求:
<html>
<body>
<%@taglib uri="/struts-tags" prefix="s" %>
<s:form action="Login">
Input your login name:<s:textfield name="loginName"></s:textfield>
Input your password:<s:textfield name="pwd"></s:textfield>
<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>
创建一个welcome.jsp来响应输出的success请求:
<html>
<body>
Welcome!${para.loginName}
</body>
</html>
检验一下成果
run as server。