1.struts工作原理
struts更好的分离了业务处理逻辑和servlet 控制器之间联系,它利用拦截器机制更好的表达了MVC模式的理念。
其工作原理图如下:
(1)当客户端发送请求到服务端时,请求首先被servlet控制器接收。
(2)控制解析web.xml文件。
(3)获取struts请求转发器(StrutsPrepareAndExecuteFilter)
(4)询问ActionMapper该请求是否可以访问某个Action
(5)如果允许,将请求交给ActionProxy
(6)ActionProxy通过ConfigurationManager解析struts配置文件
(7)ActionProxy创建ActionInvocation对象,并将请求传递给ActionInvocation,获取action信息。
(8)调用请求拦截器,进行请求过滤。
(9)访问匹配的Action处理业务逻辑。
(10)产生业务结果并通过响应拦截器将结果返回给ActionInvocation。
(11)ActionInvocation通过struts.xml找到对应的返回结果。
(12)将结果通过http请求返回给客户端。
2.Action类创建
通常在struts的业务逻辑处理Action类中我们都实现了如下方法:
public String exceute(HttpServletRequest request,HttpServletResponse response)
通常我们选择继承ActionSupport类,该类不仅定义了public void execute()方法,还支持校验、本地化等默认方法。
例如:
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
@Resource
private UserService userService;
private UserDto dto;
/**
* @return the dto
*/
public UserDto getDto() {
return dto;
}
/**
* @param dto the dto to set
*/
public void setDto(UserDto dto) {
this.dto = dto;
}
public void findUserById(UserDto dto){
String id = dto.getUser().getId();
TUser user = userService.findUserById(id);
dto.setUser(user);
}
}
Action类的创建这里说明3点:
(1)Action中的方法必须都是public类型。
(2)返回类型必须都是String类型
(3)参数列表必须为空
3.action和页面之间的参数传递
页面向Action的参数传递可以分为2中方式。
一是基本属性注入,例如:
页面:
<input type="text" name="name">
action:(定义一个属性名与页面传参名相同,并且实现setter注入,struts会自动将页面值注入进来)
private String name;
public String getName() {
return this.userName;
}
public void setName(String name) {
this.name = name;
}
页面:
<input type="text" name="dto.user.name">
action:
private UserDto dto;
public UserDto getDto() {
return dto;
}
public void setDto(UserDto dto) {
this.dto = dto;
}
页面从Action中取值
EL表达式:${属性名}
${对象.属性名}
OGNL表达式:<s:property value="属性名"/>
<s:property value="对象.属性名"
4.ActionSupport常量
SUCCESS:表示程序处理正常,并返回给用户成功后的结果
NONE:表示程序处理正常,但不返回给用户任何提示
ERROR:表示处理结果失败
INPUT:表示需要更多输入才能顺利执行
LOGIN:表示需要用户登录后才能顺利执行
5.struts在web.xml中的核心配置
<!-- 配置struts前端控制器 -->
<filter>
<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>*.do</url-pattern>
</filter-mapping>
6.struts.xml核心配置
<struts>
<!-- struts2的action必须放在一个指定的包空间下定义 -->
<package name="default" extends="struts-default">
<!-- 定义处理请求URL为login.action的Action -->
<action name="login" class="org.qiujy.web.struts.action.LoginAction">
<!-- 定义处理结果字符串和资源之间的映射关系 -->
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
7.处理结果类型
名字 | 说明 |
chain | 用来处理Action链 |
dispatcher | 用来转向页面,通常处理JSP,这是默认的结果类型 |
freeMarker | 处理FreeMarker模板 |
httpHeader | 用来控制特殊的Http行为 |
redirect | 重定向到一个URL |
redirect-action | 重定向到一个Action |
stream | 向浏览器发送InputSream对象,通常用来处理文件下载 |
velocity | 处理Velocity模板 |
xslt | 处理XML/XLST模板 |
plaintext | 显示原始文件内容,例如文件源代码 |
tiles | 结合Tile使用 |
8.访问路径
默认情况下struts的访问路径为:http://ip:端口/项目部署名/命名空间/action名!方法名.后缀
若未设置action名,则默认使用类名去掉Action作为action名。例如,如下代码若无@Action注解则访问路径为:
http://localhost/test/user/user!findUserById.htm
例如:
package com.student.system.action;
import javax.annotation.Resource;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.annotation.Scope;
import com.opensymphony.xwork2.ActionSupport;
import com.student.system.dto.UserDto;
import com.student.system.entity.user.TUser;
import com.student.system.service.UserService;
/**
* @author a
*
*/
@Namespace(value="/user")
@Scope("prototype")
@Action(value="userCtrl",results={
@Result(name="test",location="/WEB-INF/jsp/user/user.jsp")
})
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
@Resource
private UserService userService;
private UserDto dto;
/**
* @return the dto
*/
public UserDto getDto() {
return dto;
}
/**
* @param dto the dto to set
*/
public void setDto(UserDto dto) {
this.dto = dto;
}
public String findUserById(){
String id = dto.getUser().getId();
TUser user = userService.findUserById(id);
dto.setUser(user);
return "test";
}
}
上诉代码访问路径为:http://localhost/test/user/userCtrl!findUserById.htm