Struts2二

Struts2

一.Result结果配置

1.全局和局部结果
平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为 局部结果页面但是我们有时候在很多个action里面,针对不同的结果进行跳转时,也有可能跳转同一个页面,那么这个时候就可以配置全局结果页面。

1.1局部结果

  • 在action里面写上的result跳转的页面,称之为局部结果页面配置
  • <action name="demo01_*" class="com.itheima.web.action.ActionDemo01" method="{1}">
    	 <result name="error">/error.jsp</result>
    </action>
    

1.2全局结果

  • 如果有多个action的结果跳转的页面是一样的,那么我们可以提取出来,做成全局结果页面的配置. 全局页面通过package标签中配置global-results标签来定义
  • <package name="test" extends="struts-default" namespace="/">
    	<global-results>
    		<result name="error">/error.jsp</result>
    	</global-results>
      	....
    </package>
    

优先级: 局部>全局

1.3 不同包里面的全局结果配置

<struts>

	<!-- 把全局的结果配置,定义在父包里面 -->
	<package name="base" extends="struts-default" abstract="true">
		<global-results>
			<result name="error">/msg.jsp</result>
		</global-results> 
	</package>

	<package name="test" extends="base" namespace="/">
		<action name="demo01_fun01" class="com.itheima.web.ActionDemo01" method="fun01">
		</action>	
		<action name="demo02_fun02" class="com.itheima.web.ActionDemo02" method="fun02">
		</action>
	</package>
	
	<package name="test02" extends="base" namespace="/">
		<action name="demo03_fun03" class="com.itheima.web.ActionDemo03" method="fun03">
		</action>
	</package>
</struts>

2.结果的类型
根据前面学的servlet知识,我们知道服务器响应给浏览器的时候,有三种类型:response响应JSON数据&请求转发 & 重定向。 对于Struts2而言,无非就是Action跳转(转发重定向)到页面,Action跳转到Action…

文档位置 docs/docs/result-types.html

2.1Action跳转页面【重点】

  • 转发(默认)

    <result name="success" type="dispatcher">/index.jsp</result>
    
  • 重定向

    <result name="success" type="redirect">/index.jsp</result>
    

2.2Action跳转Action【重点】

  • 转发

    <action name="demo01_*" class="com.itheima.web.action.ActionDemo01" method="{1}">
    		<result name="success" type="chain">demo02_fun02</result>
    </action>
    <action name="demo02_*" class="com.itheima.web.action.ActionDemo02" method="{1}">
    </action>
    
  • 重定向

    <action name="demo01_*" class="com.itheima.web.action.ActionDemo01" method="{1}">
    		<result name="success" type="redirectAction">demo02_fun02</result>
    </action>
    <action name="demo02_*" class="com.itheima.web.action.ActionDemo02" method="{1}">
    </action>
    

2.3其它的结果
一般来说,我们平常的请求到来,我们要不就是跳转到 页面上 ,要不就是跳转到下一个action 去。 但是除了这两种结果之外,我们仍然还有一些其他结果类型可以控制.

比如: 我们可以返回一个文件数据给客户端 (比如文件下载).再比如: 我们可以返回一个json字符串给来请求的页面,而不是重新打开新的页面 (有点像之前的Ajax请求,返回json数据) 

2.3.1响应JSON数据【掌握】

  • 导入struts-json-pluginxxx.jar FastJSON Gson JSON_lib JackSon

  • Java代码

    public class ActionDemo01 extends ActionSupport {
    	private User json;
    	
    	public User getJson() {
    		return json;
    	}
    
    	public String fun01(){
    		json = new User();
    		json.setName("张三");
    		json.setAge(18);
    		json.setPassword("123456");
    		
    		return "success";
    	}
    	
    }
    
  • 配置文件

    <struts>
    	<package name="test" extends="json-default" namespace="/">
    		<action name="demo01" class="com.itheima.web.action.ActionDemo01" method="fun01">
    			<result name="success" type="json">
    				                <param name="root">json</param><!--这里的name必须是root  至于这个json 是我们在action里面的成员 变量 json(属性)  -->
    			 </result>
    		</action>
    	</package>
    </struts>
    

注意:

root:配置对象。action类中必须提供一个和root值相同的属性名称,且需要提供getter方法。

package需要继承json-default

result的type值是json

2.3.2响应流(文件下载)【了解】

  • Action里面的代码

    public class ActionDemo01 extends ActionSupport {
    	private InputStream stream;
    	
    	public void setStream(InputStream stream) {
    		this.stream = stream;
    	}
    	public InputStream getStream() {
    		return stream;
    	}
    
    	public String fun01() throws Exception{
    		System.out.println("demo01 执行了...");
    		stream = new FileInputStream("E:/data/Desktop/a.jpg");
    		
    		return "success";
    	}
    }
    
  • 配置文件

    <struts>
    	<package name="test" extends="struts-default" namespace="/">
    		<action name="demo01" class="com.itheima.web.action.ActionDemo01"
    			method="fun01">
    			<result name="success" type="stream">
    				<param name="contentType">image/jpeg</param>
    				<param name="inputName">stream</param>
    				<param name="contentDisposition">attachment;filename="b.jpg"</param>
    				<param name="bufferSize">1024</param>
    			</result>
    		</action>
    	</package>
    </struts>
    

注意:

contentType:下载文件类型

contentDisposition:下载到客户端时,客户端文件名称

bufferSize:读文件的缓存大小

inputName:对应要输出到客户端流声明的名称,也就是说需要和Action里面声明的变量名要一致

二,Struts2中的Servlet的API的访问
客户端与服务端交互时,通常会带参数过来,服务器也会回写数据给客户端。在此过程中,参与着请求,和响应,以及会话。servlet在此过程中提供了HttpServletRequest作为获取请求数据的方案,HttpServletResponse作为响应的方案,HttpSession负责了会话方案。Struts其实是基于servlet实现的web框架,他需要遵循规则提供请求,响应和会话的API供开发人员使用,因此Struts针对这一问题提供了自己的一套API封装,提供了多种方式的访问。

1.ActionContext

1.1概述
ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。

1.2使用

  • 获得(创建)ActionContext

    ActionContext context = ActionContext.getContext();
    
  • 获得请求参数

    Map<String, Object> parameters = context.getParamters();
    

    相当于Servlet中的request.getParamters()方法,只能获得所有的请求参数

2.ServletActionContext【掌握】

2.1概述
ServletActionContext继承ActionContext,因此比ActionContext功能要强大。ServletActionContext提供了多个静态方法。

2.2使用

  • 获得Request对象

    HttpServletRequest request = ServletActionContext.getRequest();
    
  • 获得Response对象

    HttpServletResponse response = ServletActionContext.getResponse();
    
  • 获得ServletContext

    ServletContext servletContext = ServletActionContext.getServletContext();
    

3.实现接口的方式

  • 编写Action,让Action使用实现特定的接口的方式访问Servlet的API,有如下接口可以实现
    ServletContextAware
    ServletRequestAware
    ServletResponseAware
    SessionAware
    ApplicationAware

  • Eg:

    public class ActionDemo03 extends ActionSupport implements ServletRequestAware {
    	private HttpServletRequest request;
    	public String fun03() throws IOException{
    		HttpServletRequest request = ServletActionContext.getRequest();
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		System.out.println(username+":"+password);
    		return NONE;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    }
    

三,获得请求参数

1.获得零散数据

1.1使用上面介绍的Struts2中的Servlet的API获取

  • ActionContext

    //1.创建ActionContext对象
    ActionContext context = ActionContext.getContext();
    //2.获得所有的请求参数(自己手动封装成对象)
    Map<String, Object> parameters = context.getParamters();
    
  • ServletActionContext

    //1.获得request对象
    HttpServletRequest request = ServletActionContext.getRequest();
    requet.getParameter(String key);
    requet.getParameterValues(String key);
    requet.getParameterMap();
    

1.2属性驱动【重点】

  • 页面

    <h1>01使用属性驱动</h1>
    <form method="post" action="${pageContext.request.contextPath }/demo01">
    	用户名:<input type="text" name="username"/><br/>
    	密    码:<input type="password" name="password"/><br/>
    	<input type="submit"/>
    </form>
    
  • Action.java

    public class ActionDemo01 extends ActionSupport {
    	private String username;//和表单里面的name属性值要一致,并且提供set方法
    	private String password;//和表单里面的name属性值要一致,并且提供set方法
    	public void setUsername(String username) {
    		this.username = username;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public String fun01(){
    		System.out.println(username+":"+password);
    		return NONE;
    	}
    }
    

2.获得封装后的数据(对象)

2.1属性驱动

  • 页面

    <h1>01使用属性驱动方式</h1>
    <form method="post" action="${pageContext.request.contextPath }/demo01">
    	用户名:<input type="text" name="user.username"/><br/>
    	密    码:<input type="password" name="user.password"/><br/>
    	<input type="submit"/>
    </form>
    
  • Action.java

    public class ActionDemo01 extends ActionSupport {
    	//1. User类里面的字段属性需要和表单里面的name属性一致, 且提供无参构造
      	//2. user需要set和get方法
    	private User user;
    	public User getUser() {
    		return user;
    	}
    	public void setUser(User user) {
    		this.user = user;
    	}
    
    	public String fun01(){
    		System.out.println(user.toString());
    		return NONE;
    	}
    }
    

2.2模型驱动【重点】

  • 页面

    <h1>02使用模型驱动方式</h1>
    <form method="post" action="${pageContext.request.contextPath }/demo02">
    	用户名:<input type="text" name="username"/><br/>
    	密    码:<input type="password" name="password"/><br/>
    	<input type="submit"/>
    </form>
    
  • Action.java
    public class ActionDemo02 extends ActionSupport implements ModelDriven {

    	private User user;
    	
    	public String fun02(){
    		System.out.println(user.toString());
    		return NONE;
    	}
    	@Override
    	public User getModel() {
    		if(user == null){
    			user = new User();
    		}
    		return user;
    	}
    
    }
    

总结: 在实际开发里面, 一般用属性驱动获得零散数据;

一般用模型驱动获得封装后的数据;

2.3封装到集合【了解】

封装到集合,一般我们会在批量添加 、批量更新场景下见到。也就是说页面上同一个请求,这时候提交过来多份数据,如果我们是批量添加用户的话,可能会提交过来多个用户,那么这个时候,我们就需要把他们封装到List集合或者Map集合中去。 刨去批量操作、我们比较少用这种封装到集合的知识点。

2.3.1封装到list

  • 页面

     <h1>01封装到list</h1>
     <form method="post" action="${pageContext.request.contextPath }/demo01">
     	用户名:<input type="text" name="list[0].username"/><br/>
     	密    码:<input type="password" name="list[0].password"/><br/>
     	用户名:<input type="text" name="list[1].username"/><br/>
     	密    码:<input type="password" name="list[1].password"/><br/>
     	<input type="submit"/>
     </form>
    
  • Action.java
    public class ActionDemo01 extends ActionSupport {

    	private List<User> list;
    	
    	public List<User> getList() {
    		return list;
    	}
    
    	public void setList(List<User> list) {
    		this.list = list;
    	}
    
    	public String fun01(){
    		System.out.println(list.toString());
    		return NONE;
    	}
    }
    

2.3.2封装到Map

  • 页面

    <h1>02封装到map</h1>
     <form method="post" action="${pageContext.request.contextPath }/demo02">
     	用户名:<input type="text" name="map['user1'].username"/><br/>
     	密    码:<input type="password" name="map['user1'].password"/><br/>
     	用户名:<input type="text" name="map['user2'].username"/><br/>
     	密    码:<input type="password" name="map['user2'].password"/><br/>
     	<input type="submit"/>
     </form>
     
    
  • Action.java
    ```
    public class ActionDemo02 extends ActionSupport {

    	private Map<String, User> map;
    	
    	public Map<String, User> getMap() {
    		return map;
    	}
    
    	public void setMap(Map<String, User> map) {
    		this.map = map;
    	}
    
    	public String fun02(){
    		Set<Entry<String, User>> entrySet = map.entrySet();
    		for (Entry<String, User> entry : entrySet) {
    			System.out.println(entry.getKey()+":"+entry.getValue().toString());
    		}
    		return NONE;
    	}
    

四,注册案例

  • 使用struts2的模型驱动获得数据(User)
  • 使用Hibernate 保存, session.save(user)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值