一、struts2
struts2 是以Webwork的设计思想为核心,吸收struts1的优点,是struts1和Webwork结合的产物。
struts2 的工作原理图:
一个请求在Struts2框架中的处理分为以下几个步骤:
1.客户端发出一个指向servlet容器的请求(tomcat);
2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2
的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一
些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,
Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中
需要用到的Action。
4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象
。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了
Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相
关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在
调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果
通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表
示的过程中可以使用Struts2 框架中继承的标签。
// struts2 action输出json public void output(JSONObject json) { try { HttpServletResponse response = getResponse(); response.setContentType("text/json;charset=UTF-8"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.getWriter().write(json.toString()); response.getWriter().flush(); } catch (IOException e) { e.printStackTrace(); } }
//struts.xml json-default: http://xu520.iteye.com/blog/1665923 <package name="default" namespace="/" extends="json-default"> </package> //action package xx.action; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import com.opensymphony.xwork2.ActionSupport; @ParentPackage("default") @Namespace("/") public class TestAction extends ActionSupport { private String name; private UserObj userObj; private List<UserObj> list; //{"list":[{"age":19,"name":"zs1"},{"age":20,"name":"zs2"}],"name":"zhang san","userObj":{"age":18,"name":"thriller"}} @Action(value = "testjson", results = { @Result(name = "success", type = "json") }) public String testJson() { this.name = "zhang san"; //json中不会出现 String nameMethod = "li si"; HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("nameMethod", nameMethod); //对象 userObj = new UserObj("thriller",18); //list list=new ArrayList<UserObj>(); list.add(new UserObj("zs1",19)); list.add(new UserObj("zs2",20)); return SUCCESS; } //必须加get,json串中才会出现 public String getName() { return name; } public void setName(String name) { this.name = name; } public UserObj getUserObj() { return userObj; } public void setUserObj(UserObj userObj) { this.userObj = userObj; } public List<UserObj> getList() { return list; } public void setList(List<UserObj> list) { this.list = list; } }
自定义拦截器:
编写拦截器类,需要实现 Interceptor接口,并实现该接口的三个方法:init ,intercept ,destroy
或者继承 AbstractInterceptor抽象类 ,并实现 intercept 方法就够了
或者继承 MethodFilterInterceptor抽象类,并实现 doIntercept方法
//struts.xml配置 <package name="default" namespace="/" extends="json-default"> <interceptors> <interceptor name="testInterceptor" class="TestInterceptor" /> <interceptor-stack name="loginStack"> <interceptor-ref name="testInterceptor"> <param name="excludeMethods"> xx,xx </param> </interceptor-ref> <interceptor-ref name="defaultStack" /> </interceptor-stack> <interceptor-stack name="nologinStack"> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="nologinStack" /> </package>
传值: xx.do?templateVo.bizType=2
Unable to load configuration. - bean - jar:file:/E:/dhlocalRepository/org/apache/struts/struts2-core/2.3.3/struts2-core-2.3.3.jar!/struts-default.xml:29:72
jar冲突。
Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
demo
页面到Action传List <input type="text" id="pagename" name="pageInfoList[0].pagename" value="页面0"/> <input type="text" id="pagename" name="pageInfoList[1].pagename" value="页面1"/> private List<PageInfoVo> pageInfoList; 页面到Action传对象 <input type="text" id="pagename" name="pageInfoVo.pagename" value="页面"/> private PageInfoVo pageInfoVo; @Action(value = "showsave", results = { @Result(name = "success", type = "velocity", location = "page/save.vm") }) public String showsave() { return SUCCESS; } @Action(value = "page_saveinfo", results = { @Result(name = "success", type = "redirect", location = "/page_list.do") }) @Action(value = "path_verification", results = { @Result(name = "success", type = "json") })
二、struts1
1)ActionForm接收数据
当点击submit后,把表单中的数据全部提交,在后台是用一个Map来接收表单中的数据,struts对ActionForm中的数据赋值也是从这个map里取值的。比如:
1:如果key是简单的'userName',直接form.setUserName(map.get('userName'));
2:如果key是'user.userName', 执行的操作是 form.getUser().setUserName(map.get
('user.userName');
3:如果key是'list[0].userName', 它可以对应到数据或集合中,如对于数组 form.list[0].
name=map.get('list[0].userName'); 对于集合(List) form.getList().get(0).setUserName
(map.get('list[0].UserName'))
2)请求转发
mapping.findForward("hello") 转向hello.jsp new ActionForward ("hello.jsp")与它效果一样 ,第一个写法规范一点 方便配置
3)页面标签库
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
类: <logic:notEmpty name="searchForm" property="title"><bean:write name='searchForm' property='title'/>test title</logic:notEmpty>
变量:<logic:notEmpty name="zero_result_precatalog"> in ${zero_result_precatalog}</logic:notEmpty>.
<logic:equal name="searchForm" property="listZeroTip" value="allcatalog"> xxx </logic:equal>
<logic:lessThan value="3" name="index"> xxx </logic:lessThan>
<logic:greaterEqual value="3" name="index"> xxx </logic:greaterEqual>
//private List<SearchProduct> productlistdatas;
<logic:iterate id="element" name="searchForm" property="productlistdatas" indexId="index" >
<a class="pro-title" href="${element.productDetailUrl}">${element.productname}</a>
</logic:iterate>
iterate标记
id 脚本变量的名称,它保存着集合中当前元素的句柄。
name 代表了你需要叠代的集合,来自session或者request的属性。
type 是其中的集合类元素的类型
length属性来指定输出元素的个数
offset属性指定了从第几个元素开始输出,如此处为1,则表示从第二个元素开始输出。
<logic:iterate id="country" name="countries">
<bean:write name="country" property="key"/>:
<bean:write name="country" property="value"/>
</logic:iterate>
<bean:write name='searchForm' property='title' />
<bean:write name="color" />
request.setAttribute("zero_result_precatalog", myForm.getCatalogname());
SearchForm myForm = (SearchForm) form; //public class SearchForm extends ActionForm
页面使用 jsp自带el表达式,如 ${searchForm.navigationLine} //设置JSP不使用EL : <%@page isELIgnored="true"%>
4)Action基类
DispatchAction继承自Action类,它是一个抽象类,封装了一些基础方法,来解决使用一个Action处理多个操作.
get: xx.do?act=updatexx
post: <input type="hidden" name="act" value="updatexx" />
参考:Struts1之Action小结 http://blog.sina.com.cn/s/blog_6ff660880101484s.html
5)Action配置属性详解
<action input="/list/listmain.jsp" name="searchForm" path="/wholesale/search"
scope="request" type="com.b2besoft.web.action.SearchAction">
<forward name="newpage" path="/list/listmain.jsp" contextRelative="true" />
<forward name="totalvitems" path="/productcount.jsp" contextRelative="true" />
<forward name="listzero" path="/list/listzero.jsp" contextRelative="true"/>
</action>
attribute:指定ActionForm保存到指定上下文所使用的属性名,如果不指定attribute属性值,
将使用name属性值作为保存时的属性名。即attribute的默认值就是name属性值。
input: 该Action中相关ActionForm获取用户输入的输入页面,当将ActionForm设为自动验证输入数据,发现不合法数据返回错误时,将返回该页面
name: 当前Action中用到的ActionForm的名字,其具体信息在配置文件其他地方另有详细定义
scope:指定保存ActionForm上下文的范围。即Action中所用到的ActionForm的生存期,可以为“request”或“session”,随着生存期的设置,该Action也会在相应的时间被创建
validate:如果本属性为true则在Action动作之前其对应的ActionForm的validate方法会自动被调用,一般用以验证用户输入的数据
forward:设置处理用户请求的Servlet或其它资源如Jsp页面等。如指定了这属性则type属性就会失去作用
严格来说<forward,include,type>属性应该使用且只使用其中的一个。 这属性用于跳转到另一个非Action处理程序中。
unknown: 如果将该属性设置为true,那么就是声明这个Action将处理整个应用中所有未找到相应处理Action的请求,当然,一个应用系统中也只会有一个Action的unknown属性可以设为true
Prefix:用来匹配请求参数与bean属性的前缀
Suffix: 用来匹配请求参数与bean属性的后缀
contextRelative 设为true时表示当前path属性以/开头时,给出的是相对于当前上下文的url。默认为false
redirect设置响应返回类型,redirect="true":重定向 缺省值为redirect="false"
6)如果想跳转到另外一个action的某个页面,可以这样:
ActionForward actionForward = new ActionForward();
actionForward.setPath("/customer/creditApprManage.do?method=searchCreditLevel&levelName=");
return actionForward;
注:如果需要重定向,只需要给actionForward加一个redirect属性,使用actionForward.setRedirect(true);
三、struts2
相关推荐
Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...
Struts1.2驱动包是Java Web开发中一个重要的组件,它是Apache Struts框架的特定版本,用于支持基于Model-View-Controller (MVC)设计模式的应用程序开发。Struts1.2因其稳定性和广泛的功能集而在过去备受推崇,尤其在...
### Struts2核心知识点解析 #### 一、Struts2框架概述 - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,...
Struts 2是一款基于Java的开源MVC框架,它在Web应用开发中广泛使用,但同时也因其复杂的架构和历史遗留问题,成为了网络安全的焦点。这个标题提到的是一个全面的Struts 2漏洞检测工具,旨在帮助开发者和安全专家识别...
该工具的打开路径为:\Struts2VulsTools-2.3.20190927\Test\bin\Release\Text.exe 2019-09-25: 优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建...
Struts是一个开源的Java Web应用程序框架,主要用于构建MVC(Model-View-Controller)模式的Web应用。在Java EE世界中,Struts扮演着至关重要的角色,它简化了开发过程,提高了代码的可维护性和可扩展性。SSH框架是...
项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...
Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它的核心是MVC(Model-View-Controller)设计模式,可以帮助开发者组织代码,提高开发效率,并且提供了丰富的特性来支持表单验证、国际化、...
Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目...
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...
struts2框架的详细搭建 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ...
struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...
Struts 2整合Struts 1,允许开发者利用Struts 1已有的投资,同时享受Struts 2带来的优势,如增强的类型安全和更强大的拦截器机制。 在《Struts 2权威指南--基于WebWork核心的MVC开发》这本书中,作者李纲深入浅出地...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它在Web开发领域中被广泛使用,提供了强大的控制层来处理请求、数据绑定、验证和结果展示。Struts2.2.3是Struts2的一个版本,这个...
北京时间8月22日13时,Apache官方发布通告公布了Struts2中一个远程代码执行漏洞(cve-2018-11776)。该漏洞可能在两种情况下被触发,第一,当没有为底层xml配置中定义的结果设置namespace 值,并且其上层动作集配置...
包含struts2-core-2.5.10.1.jar,struts2-jfreechart-plugin-2.5.10.1.jar,struts2-json-plugin-2.5.10.1.jar,struts2-junit-plugin-2.5.10.1.jar,struts2-bean-validation-plugin-2.5.10.1.jar,struts2-cdi-...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它在Web应用开发中被广泛使用。Struts2的核心是Action类,它负责处理用户请求,与模型进行交互,并将结果返回给视图。在Struts2的版本...
Struts2是一个非常著名的Java Web开发框架,由Apache软件基金会维护。它基于MVC(Model-View-Controller)设计模式,极大地简化了构建基于Java EE的Web应用程序的过程。本资源包含"struts2所有jar包程序文件",是...
Struts-config详解 Struts-config.xml 是Struts框架的核心配置文件,它描述了所有的Struts组件。在这个文件中,我们可以配置主要的组件及次要的组件。下面是struts-config.xml文件的主要元素: 一、struts-config....