认识Struts2
Struts2中的控制器分为两部分:
核心控制器:web.xml中配置的StrutsPrepareAndExecuteFilter(过滤器),负责过滤所有的用户请求,根据不同的请求,分发给不同的Action处理。
业务控制器:业务控制器就是Action,负责调用模型来实现请求的业务,并把结果交给视图来展示。
搭建Struts2开发环境的步骤:
在项目中导入Struts2所必须的jar包。常用的jar包有:
commons-fileupload-1.2.2.jar struts文件的上传下载。
Commons-io-2.0.1.jar 文件读取
Commons-lang3-3.1.jar 为java.lang包提供扩展
Freemarker-2.3.19.jar 一个基于模板生成文本输出的通用工具
Ogln-3.0.5.jar 支持OGNL表达式
Struts2-core-2.3.4.1.jar struts2的核心包
Xwork-core-2.3.4.1.jar x-work的核心包
Javassist-3.11.0.GA.jar 分析、编辑和创建Java字节码的类库
修改web.xml配置文件。在web.xml文件的<web-app>节点下添加 StrutsPrepareAndExecuteFilter过滤器。它是struts2的核心控制器,负责拦截用户的请求,交给struts2的框架进行处理。
Web.xml
<web-app>
<filter>
<filter-name>
<filter-class>
org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter-name>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
添加struts.xml配置文件。Struts.xml是struts2的核心配置文件,该文件通常放在Src目录下,编译部署后,它就到了应用程序的WEB-INF\classes目录下。
使用struts2输出 “hello word” 需要完成以下两个步骤
添加并实现Action类
在struts.xml中配置<action>及<result>
HelloAction.java 关键代码
public class HelloAction extends ActionSupport{
public String print() throws Exception {
System.out.println(“hello world”);
return “success”;
}
}
Struts.xml配置文件关键代码:
<struts>
<package name=”default” namespace=”/” extends=”sturts-default”>
<action name=”hello” class=”com.action.HelloAction” method=”print”>
<result name=”success”>
/hello.jsp
</result>
</action>
</package>
</struts>
Action(业务控制器)
action接收参数的三种方式
属性方式接收
JavaBean方式接收
ModelDriven方式接收
属性方式接收:
Action.java关键代码:
public class UserAction extends ActionSupport{
Private String userName;
Private String password;
Getter()....setter().....
public String login() throws Exception{
Dao.login()......
return ”success”
}
}
Javabean方式接收:
public class UserAction extends ActionSupport{
Private User user;
Getter()....setter().....
public String login() throws Exception{
Dao.login()......
return ”success”
}
}
Jsp文件中属性要写成:name=”user.userName” name=”user.password”
ModelDriven方式接收参数
UserAction.java要实现ModelDriven接口
public class UserAction implements ModelDriven{
private User user = new User();
public User getModel(){
return user;
}
public String login(){
.....
return “success”;
}
}
Method属性
使用method属性指定调用的方法,在一个Action中一般会有多个业务方法。
如
public class xxxAction extends ActionSupport{
//添加
Public String add(){
....
Return “add”;
}
Public String update(){
...
Return “update”;
}
...
}
Struts.xml文件
<package name=”default” namespace=”/” extends=”struts-default”>
<action name=”xxx_add” class=”com.action.xxxAction” method=”add”>
<result>
/xxxadd.jsp
</result>
</action>
<action name=”xxx_update” class=”com.action.xxxAction” method=”update”>
<result>
/xxxupdate.jsp
</result>
</action>
</package>
使用通配符简化<action>的配置
<include>包含配置文件
Struts.xml文件:
<include file=”struts-user.xml”></include>
<include file=”struts-sale.xml”></include>
<result>的配置
<result>的name属性可以根据Action中方法的返回值跳转到相应的页面。
如:
loginAction.java
public class UserAction extends ActionSupport{
...
public Stirng login(){
...
if(....){
return “login”;
}else{
return “relogin”;
}
}
}
Struts-user.xml文件
<package name=”default” namespace=”/user” extends=”struts-default”>
<action name=”login” class=”com.action.UserAction” method=”login”>
<result name=”login”>/index.jsp</result>
<result name=”relogin”>/login.jsp</result>
</action>
</package>
<result>的type属性
Ø dispatcher : 请求转发到指定的URL (默认)
Ø redirect : 请求重定向到指定的URL
Ø redirectAction : 请求重定向到指定的Action
Ø chain : Action 链式处理,将请求转发到指定的Action
Ø json: 实现Ajax时,返回JSON对象。
全局结果的配置
<global-results>
<result name=”error”>
/error.jsp
</result>
</global-results>
异常映射的配置
<global-results>
<result name=”error1”>/error1.jsp</result>
<result name=”error2”>/error2.jsp</result>
...
</global-results>
<global-exception-mapping>
<exception-mapping result=”error1” exception=”java.lang.NullPointerException”>
</exception-mapping>
<exception-mapping result=”error2” exception=”java.sql.SQLException”>
</exception-mapping>
</global-exception-mapping>
使用ActionContext访问 Servlet API
Struts2提供了一个ActionContext类,该类被称为action上下文或者action环境,action可以通过该类来访问最常用的Servlet API 最常用的方法:
getContext() 静态方法,获取当前的ActionContext实例
getSession() 返回一个Map对象,该对象模拟了session作用域
getApplication() 返回一个Map对象,该对象模拟了application作用域
get(String key) 对该方法传入”request”参数,即可返回一个Object对象,该对象模拟了request 作用域。
getParameters() 返回一个Map对象,该对象中保存了浏览器上传的参数。
例:
public class UserAction extends ActionSupport{
public String login(){
Map<String,Object> session = ActionContext.getContext().getSession();
session.put(“username”,user.getUserName());
}
}
拦截器
拦截器是Struts2处理请求的核心机制,它可以在Action被调用之前和之后执行代码。
以Action接收参数和实现数据校验为例,说明拦截器的工作原理:
Struts2接收到请求后,创建Action的实例,此时Action中还没有接收上传的参数,
也没有对参数进行验证。
Struts2运行名称为params的拦截器,把请求中附带的参数转存到Action的属性中。
Struts2再运行名称为validation的拦截器,对Action属性中的参数进行验证。
验证通过后,运行Action中处理业务的方法,并得到处理结果,如“success”等
Action把处理结果返回给validation拦截器,再返回给params拦截器,最后Struts2
根据这个结果调用相应的视图来展示数据。