Struts2页面数据流向及获取方法
struts2执行流程及工作原理

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对象倒序执⾏拦截器。
02-Struts2的工作流程及配置文件

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中的jsp值传到后台action接收的三种方法

struts2中的Action接收表单传递过来的参数有3种方法:如,登陆表单login.jsp: <form action="login" method="post" name="form1"> 用户名:<s:textfield name="username"/><br/> 密 码:<s:password name="password"/><br/> <s:submit value="提交"/> </form> 1.在Action类中定义表单属性,两者属性名称必须一致。提供setter,getter方法。即可接收到表单传过来的参数. 这种接收参数的方法,方便简单,但是结构性不是很好,且当表单传递来的参数很多的时候,整个Action类中充斥着setter,getter方法,程序结构不是很美观。 2.把表单传递过来的参数封装成一个类,然后调用其中的属性. 如,把login.jsp页面要传来的参数进行封装 private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { ername = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } 然后再Action方法中,定义该类的对象就可以了,如 public class loginAction extends ActionSupport{ private Users users; public Users getUsers(){ return users; } public void setUsers(Users users){ ers=users; } } 通过这种方法传值,还必须在jsp页面做一下处理,login.jsp中from1的属性名应该改成这样: 登陆表单login.jsp: <form action="login" method="post" name="form1"> 用户名:<s:textfield name="ername"/><br/> 密 码:<s:password name="users.password"/><br/> <s:submit value="提交"/> </form> 这种方法,在struts开发中是很常用的一种方法! 3.通过实现ModelDriven接口接收表单数据首先Action类必须实现ModelDriven接口,同样把表单传来的数据封装起来,Action类中必须实例化该对象,并且要重写getModel()方法 public class loginAction extends ActionSupport implements ModelDriven<Users>{ private Users users =new Users(); public Users getModel(){ return users; } } 三种方法各有所好,根据不同情况选择使用
Struts2--result页面跳转forward--get方式和post方式的获取参数

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批量获取参数的一些方法及改进之前用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工作流程摘要: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流程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从后台传递数据到前台的主要方法和流程

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")获得被传递的数据对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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类型的属性返回的值。