struts2的认识

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值