Struts2页面数据流向及获取方法
- 格式:doc
- 大小:43.50 KB
- 文档页数:5
struts2执⾏流程及⼯作原理1 ⽤户发送请求;2 这个请求经过⼀系列的过滤器(Filter)(这些过滤器中有⼀个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 接着FilterDispatcher被调⽤,FilterDispatcher询问ActionMapper来决定这个请求是否需要调⽤某个Action ;4 如果需要处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停⽌过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。
FilterDispatcher把请求的处理交给ActionProxy ;5 ActionProxy通过Configuration Manager询问框架的配置⽂件struts.xml,找到需要调⽤的Action类。
(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存⾥,并缓存,当ActionProxy带着URL向他询问要运⾏哪个Action的时候,就可以直接匹配、查找并回答了)6 ActionProxy创建⼀个ActionInvocation的实例。
7 ActionInvocation实例使⽤命名模式来调⽤,在调⽤Action的过程前后,涉及到⼀系列相关拦截器(Intercepter)的调⽤。
8 ⼀旦Action执⾏完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的⼀个Action链)⼀个需要被表⽰的JSP或者FreeMarker的模版。
在表⽰的过程中可以使⽤Struts2 框架中继承的标签。
9 最后,ActionInvocation对象倒序执⾏拦截器。
Struts2的工作流程及配置文件--- ---Struts2.0的流程图从图中看到Struts2的工作流程如下:1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter><filter-name>setCharactor</filter-name><!-- 配置字符过滤--><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter><filter-name>struts2</filter-name><!-- 配置Struts2过滤器--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>setCharactor</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。
Struts2--result页⾯跳转forward--get⽅式和post⽅式的获取参数⼀.总体概述这篇⽂章是写基于struts2(整合了ssh)的2个页⾯之间的跳转传参。
突然这天想到,struts2的result有很多的type类型(跳转,重定向,。
),于是就回忆起,跳转和重定向的不同(跳转地址栏不变,共享参数;重定向地址栏改变,不再共享参数)。
⼼⾥好奇,struts2⾥页⾯跳转的时候,get的⽅式提交时怎么再第⼆个页⾯获取参数的,post是怎么在第⼆个页⾯获取参数的。
重定向⼜是怎么样的呢?真的抱歉,我今天花了⼀天时间,只弄清楚了页⾯跳转,关于页⾯重定向传参明天再搞。
本来这篇博客都没有的,因为我写了⼀半了,把get⽅式的写好了,搞post⽅式的时候太久了。
回到这个页⾯不⼩⼼把前⾯的写的删了,写了新的话,⼀瞬间反应过来,晚了,⾃动保存了。
时间宝贵者,可以直接看正⽂的第2部分⼆.正⽂1.get⽅式提交,页⾯跳转后,在后者页⾯获取参数。
(1)先是在start.hml页⾯,⽤get⽅式提交数据(username,password)到ForwardAction,然后这个action返回SUCCESS(execute⽅法⾥没有处理任何东西,只是返回SUCCESS),然后根据定义的result(name为success)采⽤type=dispatcher(即页⾯跳转)的⽅式,跳转到后者页⾯end.html。
在end.html很简单就能取到start.html页⾯上传的参数,因为页⾯跳转地址栏没变化,⽽且get⽅式还是显⽰上传参数和值的,这样我们只要⽤js去解析地址栏,获取其中的上传参数就⾏了。
思路说道这⾥很多⼈应该就懂了,其实get⽅式的提交就变成了怎么⽤js去解析地址栏获取上传参数。
由于之前写的不⼩⼼覆盖了,现在也很晚了,这个也简单,没办法明天有时间补上来。
(2)代码:①:start.html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="forget" method="get"><table style="width:300px;height:150px;border:1px solid red;"><tr><td>username:</td><td><input name="username"></td></tr><tr><td>password:</td><td><input name="password"></td></tr><tr><td colspan="2"><input type="submit" value="get⽅式跳转页⾯"></td></tr></table></form></body></html>②:ForwardActionpackage com.st.action;import java.util.HashMap;import java.util.Map;import com.opensymphony.xwork2.ActionSupport;import net.sf.json.JSONObject;public class ForwardAction extends ActionSupport {private String username;//上传参数:usernameprivate String password;//上传参数:passwordpublic String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}//下⾯这个⽅法是处理start提交的请求的,其实没有处理任何事,因为它的业务只是要跳转到end页⾯public String execute(){System.out.println("I have entered execute");return SUCCESS;}}③struts.xml<!-- 对应的就是ForwardAction,bean的实例化是交由spring管理的 --><package name="mytest" extends="struts-default"><action name="forget" class="forwardaction" method="execute"><result name="success">end.html</result></action></package>④end.html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><script src="js/jquery-3.1.1.js"></script></head><body><table style="width:400px;height:200px;border:1px solid red;"><tr><td>接收的参数username:</td><td><div id="username" style="color:red;"></div></td></tr><tr><td>接收的参数password:</td><td><div id="password" style="color:red;"></div></td></tr><tr><td><input type="submit" value="点我接收get⽅式跳转过来的参数" onclick="me()"></td></tr></table><script>//⽤正则表达式的⽅式从地址栏获取参数值function getQueryString(name){var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)");var r=window.location.search.substring(1).match(reg);if(r!=null){return unescape(r[2]);}else{return null;}}//简单的调⽤上⾯的函数,并且显⽰下参数值function me(){$('#username').html(getQueryString('username'));$('#password').html(getQueryString('password'));}</script></body></html>(3)相关截图2.post⽅式提交,页⾯跳转后,在后者页⾯获取post⽅式上传的参数(1)概述:这个我也是觉得get⽅式能获取,post是地址栏看不见的,那该怎么获取呢,能获取吗?我去百度搜了,很多“不能”“不知道,没试过”“通过ajax”,但是说实话,说的很模糊。
Struts2批量获取参数的一些方法及改进之前用struts2弄一个erp项目,里面的表单字段数比较多。
刚刚开始的时候耐心的一个一个去从request中拿,后来实在是受不了这种体力劳动了,遂上网寻找解决方案。
总结起来,目前市面上比较常用的struts2批量获取参数的方法主要有以下几种。
1:通过添加action的属性设置get和set获取。
这种方法是最常见的,确实挺高效,但我一直不愿意用。
主要是感觉这种方法会导致整个action代码十分混乱,它们应该被集中起来放到一个对象(view object)中才对。
并且通过这种方式,我们不能自己去控制它的默认值,得去深入了解struts2的脾气。
2:在action中设置一个对象获取。
确实,action中可以构建一个对象,然后把属性塞到这个对象里,struts2框架会帮你把前端传递过来的数据填充进去。
但最让人郁闷的是,页面变量名的书写格式必须是【对象名.属性名】。
Oh,shit!为什么要弄这种耦合呢,本来页面就是要尽量的与后台分离,你总不能让前端写页面的时候先问下你打算用哪个类名吧。
完全不理解struts2的作者,都到这一步了还急着去打dota,难道说是有什么别的目的,这个我就不懂了,有高人可以指点下。
3:ModelDriven接口Struts2有一个ModelDriven接口。
使用实例如下:public class YouAction extends ActionSupport implements ModelDriven<YourBean> { private YourBean sheep = new YourBean;public YourBeangetSheep() {return sheep;}public void setSheep(YourBean sheep) {this.sheep = sheep;}public String execute() throws Exception {return SUCCESS;}@overridepublic YourBeangetModel(){return sheep;}}为什么需要在两个地方指定bean呢,弄成一个的不行么?或者,完全不需要指定的不行么?其实我没用的原因主要是我没调试成功~~!不知道是不是我的bean继承了太多层还是我的action继承了太多层,总之我这样写,数据没给我放好,还请高手指点。
struts2工作流程Struts2工作流程摘要:Struts2是一个基于MVC(Model-View-Controller)设计模式的web应用程序开发框架。
本文将介绍Struts2的工作流程,包括请求的处理过程、核心组件的作用以及如何扩展和定制框架。
引言:在web应用程序开发过程中,使用一个成熟的框架可以大大提高开发效率和代码质量。
Struts2是一个功能强大、易于使用的开源框架,已经被广泛应用于Java EE开发领域。
了解Struts2的工作流程能够帮助开发者更好地理解框架的运作原理,从而更好地设计和开发web应用程序。
一、请求的处理过程当客户端发起一个请求时,Struts2框架会按照特定的流程来处理请求并生成相应的响应。
下面是Struts2请求处理过程的简要说明:1. 客户端发送请求。
2. 服务器接收请求并将其传递给Servlet容器。
3. Servlet容器(如Tomcat)将请求交给Struts2的过滤器(StrutsPrepareAndExecuteFilter)进行处理。
4. 过滤器通过解析请求的URL来确定该由哪一个Action类来处理请求。
5. 过滤器创建一个ActionInvocation对象,将该对象传递给Struts2的核心控制器(ActionProxy)。
6. 核心控制器根据Action类的配置信息和请求参数来调用对应的Action类的方法。
7. Action类的方法执行相应的业务逻辑,并返回一个结果(Result)对象。
8. 核心控制器将结果传递给结果视图(Result View),最终生成响应。
9. 响应返回给Servlet容器,然后传递给客户端。
二、核心组件的作用Struts2框架中有几个核心组件,这些组件共同协作来处理请求并返回响应。
下面我们来看一下它们的作用:1. 过滤器(StrutsPrepareAndExecuteFilter):负责处理所有传入请求并将其交给适当的Action类进行处理。
struts2流程Struts2是一种基于Java的Web应用程序框架,它是在Servlet、JSP、JavaBean等技术的基础上开发的,目的是为了简化Web应用程序的开发和维护过程。
Struts2框架采用MVC(模型-视图-控制器)的架构模式,通过将用户请求分发给相应的控制器,然后根据控制器的指令进行处理,再将结果返回给用户进行展示。
下面我们将详细介绍Struts2的工作流程。
Struts2的工作流程可以分为以下几个步骤:1. 客户端发送请求:当用户通过浏览器访问某个URL地址时,客户端会生成一个HTTP请求,该请求会发送给服务器。
2. DispatcherServlet拦截请求:服务器接收到请求后,DispatcherServlet作为Struts2的核心控制器将拦截该请求。
3. 根据请求寻找相应的Action:DispatcherServlet会根据请求的URL地址和配置文件中的映射规则,找到匹配的Action类。
4. 创建Action实例:一旦找到了匹配的Action类,Struts2会创建该Action类的一个实例。
5. 封装请求参数:Struts2框架会自动将请求中的参数封装到Action实例中的属性中,以便在后续的处理中使用。
6. 调用Action方法:一旦请求参数被封装好,Struts2框架会调用对应Action类中的相应方法来处理该请求。
在Action方法中,可以进行一些业务逻辑的处理,并返回相应的结果。
7. 响应结果处理:Action方法的执行结果会被封装到一个Result对象中,该对象包含了结果的类型和数据。
Struts2框架会从配置文件中查找对应的结果视图,并将结果数据传递给视图进行展示。
8. 渲染视图:Struts2会将结果视图进行渲染,然后将渲染后的内容发送给客户端的浏览器。
9. 响应结果发送给客户端:服务器会将渲染后的内容作为HTTP响应发送给客户端的浏览器,浏览器接收后进行展示。
Struts2从后台传递数据到前台的主要方法和流程两种主要方式:一和Servlet API耦合的访问方式二和Servlet API解耦的访问方式********************************************************************一和Servlet API耦合的访问方式1、采用Request(HttpServletRequest)对象来传递数据(1)在Action类文件中(A)导入ServletActionContext类:import org.apache.struts2.ServletActionContext;(B)获得request对象,具体的方法如下:HttpServletRequest request=ServletActionContext.getRequest();(C)通过setAttribute()方法把需要传递的数据对象放入request对象中:request.setAttribute("key",Object);(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:(A)request.getAttribute("key")获得被传递的数据对象。
(B)<s:iterator value="#request.key">获得被传递的数据对象。
2、采用application(ServletContext)对象来传递数据(1)在Action类文件中(A)导入ServletActionContext类:import org.apache.struts2.ServletActionContext;(B)获得application对象,具体的方法如下:ServletContext application=ServletActionContext.getServletContext();(C)通过setAttribute()方法把需要传递的数据对象放入application对象中:application.setAttribute("key",Object);(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:(A)application.getAttribute("key")获得被传递的数据对象。
struts2工作流程Struts2工作流程。
Struts2是一个开源的Web应用框架,它基于MVC(Model-View-Controller)设计模式,用于简化Java Web应用程序的开发。
它提供了一套强大的工具和库,可以帮助开发人员构建灵活、可维护的Web应用程序。
在本文中,我们将详细介绍Struts2的工作流程,包括请求的处理过程、数据的传递方式以及页面的渲染流程。
首先,当用户发送一个HTTP请求时,请求会被DispatcherServlet拦截并交给Struts2的核心控制器ActionProxy进行处理。
ActionProxy会根据请求的URL找到对应的Action类,并执行其对应的方法。
在执行Action方法之前,Struts2会对请求参数进行封装,将其转换成Action类的属性,并注入到Action对象中。
这样,Action类就可以获取到用户提交的数据,并进行相应的处理。
接下来,Action类会根据业务逻辑进行处理,并返回一个结果字符串。
这个结果字符串会被解析成一个逻辑视图,然后由Result对象进行渲染。
在渲染过程中,Struts2会根据配置文件中的结果类型,选择合适的渲染方式,比如将数据填充到JSP页面中,或者返回一个JSON格式的数据。
最终,渲染后的结果会被返回给用户,完成整个请求-响应的过程。
在整个工作流程中,Struts2提供了丰富的拦截器机制,可以在请求的不同阶段进行处理。
拦截器可以用于权限控制、日志记录、异常处理等,可以很好地帮助开发人员进行业务逻辑的分离和复用。
此外,Struts2还支持国际化和主题切换,可以根据用户的偏好提供不同的界面显示效果。
总的来说,Struts2的工作流程非常清晰和灵活,它将请求处理、业务逻辑和页面渲染等功能进行了良好的分离,使得Web应用程序的开发变得更加简单和高效。
通过深入了解Struts2的工作流程,开发人员可以更好地利用其提供的功能和特性,构建出更加稳健和可扩展的Web应用程序。
struts2工作流程解析1. 初始的哀求通过一条标准的过滤器链,到达 servlet 容器 ( 比如toat 容器,WebSphere 容器 )。
2. 过滤器链包括可选的ActionConttCleanUp 过滤器,用于系统整合技术,如 SiteMesh 插件。
3. 接着调用 FilterDiser(或者SutsPrepareAndExeeFilter),FilterDispatcher 查找 ActionMapper,以确定这个哀求是否需要调用某个 Action。
4. 假如 ActionMapper 确定需要调用某个 Action,FilterDispatcher 将控制权交给 ActionProxy。
5. ActionProxy 依照框架的配置文件(struts.xml),找到需要调用的 Action 类。
6.ActionProxy 创建一个 ActionInvoion 的实例。
ActionInvocation 先调用相关的拦截器(Action 调用之前的部分),最后调用 Action。
7.一旦 Action 调用返回结果,ActionInvocation 按照 struts.xml 配置文件,查找对应的转发路径。
返回结果通常是(但不总是,也可能是另外的一个 Action 链)JSP 技术或者 FreeMarker 的模版技术的网页展现。
Struts2 的标签和其他视图层组件,协助展现我们所需要的显示结果。
在此,我想说清晰一些,终于的显示结果一定是 HTML 标签。
标签库技术和其他视图层技术只是为了动态生成 HTML 标签。
8. 接着根据相反次序执行拦截器链 ( 执行 Action 调用之后的部分 )。
最后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。
假如过滤器链中存在ActionContextCleanUp,FilterDispatcher 不会清理线程局部的ActionContext。
Struts2页面数据流向及获取方法
Struts2架构下的视图(浏览器页面)由JSP 组成,而这些JSP 又是通过Action 将他们衔接在一起,这样就形成了内容显示和业务逻辑的有机结合。
每个JSP 页面的数据不仅可以从上级Action 获得,而且还可以从全局Session 获得,也可以从在本页面实例化的Bean 中获得。
本文重点介绍JSP 从上级Action 获得数据和从Bean 获得数据的原理和方法。
上图是一个典型的Struts2框架下的JSP 、Bean 、Action 关系图,JSP 页面可以实例化多个Bean ,这些Bean 为该JSP 页面填充数据,JSP 也通过本页面Form 表单的Action 获取Form 表单的数据,然后传递给下级JSP 。
(一)JSP 获取Bean 属性值
如果JSP 页面需要动态获得一些内容的初始值来填充页面元素,则需要实例化一个Bean ,通过设置Bean 的某个属性值A ,并将这个属性值作为获取另外符合条件的属性值参数传递给Bean ,再获取这个属性值填充页面内容,具体编程步骤如下:
1.创建Bean
根据业务逻辑编写相应的Bean 代码,添加相应的属性即getter/setter 方法。
/** JSP
(含Form 及Action )
响应Action 的JSP 响应Action 的JSP Bean
Bean Bean
Bean Bean
Bean
*/
package com.crazyicelee.bean;
import java.util.List;
Import java.util.ArrayList;
/**
* @author crazyicelee
*
*/
public class book {
private List<String> mathBook;
private String nameP;
/**
* @param mathBook the mathBook to set
*/
public void setMathBook(List<String> mathBook) { this.mathBook = mathBook;
}
/**
* @return the mathBook
*/
public List<String> getMathBook() {
List<String> ll=new ArrayList<String>();
ll.add("一年级数学上册");
ll.add("二年级数学上册");
mathBook=ll;
return mathBook;
}
/**
* @param name the name to set
*/
public void setNameP(String name) {
P = name;
}
/**
* @return the name
*/
public String getNameP() {
nameP="skjhdfkjahsfdkj";
return nameP;
}
2.在JSP页面实例化该Bean并操作Bean属性
Struts2对Bean的操作非常简单,有现成的标签可以使用,主要有<s:bean>、<s:param>、<s:property>三个标签配合使用。
<s:bean id="id" name="class" />用来实例化一个Bean,id是在Bean标签外引用Bean属性时的实例标识,name是指定该Bean所在包及对应的class名称。
<s:param name="name" value="李征兵"/></s:param>用来给Bean的某个指定属性赋值,name是属性名称,value是给定的值,这个标签必须放在<s:bean>标签体内,在实际使用中发现如果使用value赋值则并没有赋值成功,而必须将值写到标签体内,才能够赋值成功,即<s:param name="name"/>李征兵</s:param>才能够赋值成功。
<s:property value="name"/>用来显示Bean某个指定属性的值,value的值是属性名称。
如果要显示的属性值在<s:bean>标签体外,则必须使用#这种表达式来指定是那个Bean的那个属性。
例如:
<!--实例化Bean并设定id-->
<s:bean id="b"name="com.crazyicelee.bean.book">
<!--给Bean的属性赋值-->
<s:param name="nameP">李征兵</s:param>
<!--在Bean内部显示属性值-->
<s:property value="nameP"></s:property>
</s:bean>
<!--在Bean外部显示属性值-->
<s:property value="#P"/>
显示集合类Bean属性的某个指定key的值获取方法如下:
<!--List、Array型属性获取方法,key为0的属性值-->
<s:property value="javaBook[0]"/>
<!--Map型属性获取方法,key为one的属性值-->
<s:property value="cBook['one']"/>
显示对象类属性的对象属性获取方法如下(其中:b是Bean的id,user是该Bean属性名称,name是对象属性的属性名称,可以以此类推实现多级属性取值):
<s:property value="#"/>
另外:针对对象型属性赋值必须先定义一个对象,然后把这个对象赋给该属
性对象,即对象类型的属性返回前必须实例化。
例如,下面的Bean getter方法:public User getUserObject() {
User u=new User("李","征兵");
userObject=u;
return userObject;
}
(一)响应Action的JSP获取Action属性值
Struts2将Action设置为一个特殊的Bean,所以Action也具备Bean的所有特性,也就是Action获取的数据也可以用Bean的操作方式操作。
例如:一个Action的响应JSP获取该Action从上级JSP页面的Form表单获取的数据就可以用下面的代码实现。
<s:property value="name"/>
1.集合类型属性的获取和显示
Bean的属性如果是集合类型的数据(List、Map、Array、Collection、Enumeration、Iterator等),则必须通过遍历器选取该属性的所有值。
遍历集合型属性值的所有元素代码如下:
<s:iterator value="javaBook">
<s:property/>
</s:iterator>
2.将Bean的属性值赋给JSP页面Form表单的一些字段作为初始值
Form表单的一些字段往往需要从服务器端动态获取一些值作为初始值,这时候就需要通过Bean的方式提供,当然也可以从上级Action中获取。
常见的如<s:checkboxlist>、<s:select>、<s:doubleselect>、<s:optiontransferselect>等标签中的list属性就从Bean取得初始值:
<s:checkboxlist list="#Y"name="done"label="权限"></s:checkboxlist>
其中#Y就是id为author的Bean中List类型的属性返回的值。