struts2学习笔记(二)

本文深入探讨Struts2框架的高级用法,包括结果跳转方式如转发、重定向,访问Servlet原生API,参数接收的各种方法如属性驱动、对象驱动、模型驱动及集合、Map参数绑定,为开发者提供全面的Struts2应用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、结果跳转方式

1.1 转发

这是默认的方式,转发到某个jsp页面,地址栏不发生变化

<package name="Action2" namespace="/action2" extends="struts-default">  
	<action name="StrutsAction2" class="cn.itcast.action.StrutsAction2">
		<result name="success" type="dispatcher">/index.jsp</result>                                     
	</action>                                                           
</package>                                                              

1.2 重定向

重定向和转发差不多,但是重定向会设计到地址栏的变化。

<package name="Action2" namespace="/action2" extends="struts-default">  
	<action name="StrutsAction2" class="cn.itcast.action.StrutsAction2">
		<result name="success" type="redirect">/hello.jsp</result>                                     
	</action>                                                           
</package>                                                              

可以发现地址栏就会变成了hello.jsp

1.3 转发到Action

<package name="Action1" namespace="/action1" extends="struts-default">  
	<action name="StrutsAction1" class="cn.itcast.action.StrutsAction1">
		<result name="success" type="chain">                            
			<param name="actionName">StrutsAction2</param>              
			<param name="namespace">/action2</param>                    
		</result>                                                       
	</action>                                                           
</package>                                                              

1.4 重定向到Action

<package name="Action1" namespace="/action1" extends="struts-default">  
	<action name="StrutsAction1" class="cn.itcast.action.StrutsAction1">
		<result name="success" type="redirectAction">                            
			<param name="actionName">StrutsAction2</param>              
			<param name="namespace">/action2</param>                    
		</result>                                                       
	</action>                                                           
</package>              

访问 http://emmapc:8080/strutsday01/action1/StrutsAction1 地址栏变化为

二、访问Servlet原生Api

2.1 原理

ActionContext是struts2的Action封装的上下文,包含了所有原生的域对象,保存了他们的引用。

2.2 访问域对象的方式

2.2.1 通过ActionContext

@Override                                                                                                   
public String execute() throws Exception {                                                                  
	// 获取request域对象 不推荐                                                                                     
	Map<String, Object> requestScope = (Map<String, Object>) ActionContext                                  
			.getContext().get("request");                                                                   
    // 获取类似的request域对象 推荐                                                                                              
	ActionContext.getContext().put("name", "lisi");                                                         
                                                                                                            
	//获取session域对象                                                                                          
	Map<String,Object> sessionScope = (Map<String,Object>)ActionContext.getContext().getSession();          
	sessionScope.put("name", "sessionScope");                                                               
	                                                                                                        
	Map<String,Object> applicationScope = (Map<String,Object>)ActionContext.getContext().getApplication();  
	applicationScope .put("name", "applicationScope");                                                      
	                                                                                                        
	return super.execute();                                                                                 
}                                                                                                           

jsp中的写法

 <body>                                       
    action2,jsp<br>                           
   request:${requestScope.name}<br>           
   session:${sessionScope.name}<br>           
   application:${applicationScope.name}<br>   
 </body>                                      

2.2.2 通过ServletActionContext

 
@Override                                                                                                   
public String execute() throws Exception {                                                                  
                                                                             
    HttpServletRequest request = ServletActionContext.getRequest();              
                                                                             
    HttpSession session = request.getSession();                                  
                                                                             
    HttpServletResponse response = ServletActionContext.getResponse();           
                                                                             
    ServletContext servletContext = ServletActionContext.getServletContext();                                                       
	                                                                                                        
    return super.execute();                                                                                 
}                           

2.2.3 通过实现接口的方式

public class StrutsAction2 extends ActionSupport implements ServletRequestAware {                                
                                                                                                                 
	private HttpServletRequest request;                                                                          
                                                                                                                 
	@Override                                                                                                    
	public void setServletRequest(HttpServletRequest request) {                                                  
		this.request = request;                                                                                  
		                                                                                                         
	}                                                                                                            
	
}                                                                                                                

类似的还有 ServletResponseAware,ServletSessionAware等分别获得response和session对象。

三、参数接收

3.1 扩展

3.3.1 struts2的MVC模式

 

3.3.2 Action的生命周期

1.每次请求来时,都会创建一个Action的实例

2.Action是线程安全的,可以使用成员变量接受参数。

3.2 属性驱动获得参数

public class PropertyDrivenAction implements Action {

	private Integer age;
	private String name;
	
	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String execute() throws Exception {

		System.out.println(age);
		System.out.println(name);
		return SUCCESS;
	}


}

访问参数名称对应的值会被填充到age和name中

3.3 对象驱动获取参数

public class ObjectDrivenAction implements Action {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {

		System.out.println(user);

		return SUCCESS;
	}

}
 <body>
     <form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
     name:<input name="user.age" type="text"/>
     age:<input name="user.name" type="text"/>
  
     <input type="submit" value="提交" />
     </form>
  </body>

提交的时候 参数名为user.age和user.name 就可以了,这是一个区别

3.4 模型驱动获取参数

public class StrutsAction1 implements Action,ModelDriven<User> {

	private User user = new User();
	@Override
	public String execute() throws Exception {
	    System.out.println(user);
		return SUCCESS;
	}

	@Override
	public User getModel() {
		return user;
	}

}

这样的话直接提交 age和name就可以了,不过这种方式也有缺点,就是只能用接受一个对象绑定参数。

3.5 集合参数绑定

public class StrutsAction1 implements Action {

	private List<String> list;
	
	public List<String> getList() {
		return list;
	}

	public void setList(List<String> list) {
		this.list = list;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(list);	
		return SUCCESS;
	}
	
}
 <body>
     <form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
     	list:<input name="list" type="text"/>
     	list:<input name="list[2]" type="text"/>
     	<input type="submit" value="提交" />
     </form>
  </body>

提交之后会打印出来[123,null,123],name中的方括号表示了集合中的索引值,是要绑定到集合的那个索引位置。

3.6 Map参数绑定

public class StrutsAction1 implements Action,ModelDriven<User> {
	
	private Map<String,String> map;

	public Map<String, String> getMap() {
		return map;
	}

	public void setMap(Map<String, String> map) {
		this.map = map;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(map);	
		return SUCCESS;
	}

}
 <body>
     <form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
     	<input type="text" name="map['username']" />
     	<input type="submit" value="提交" />
     </form>
  </body>

便是绑定到名称为map的Map中的key为username的值中,绑定完之后打印输出{username=123}

四、总结

今天我们学些了struts的一些高级用法,为接下来的开发做准备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值