Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。【本文的演示项目以Struts 2.3.16 版本为例】
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/35984507】
对于IoC来说,常见的就是Spring框架的了。并且在目前Java EE开发中,使用SSH框架时,也主要依赖于Spring框架所提供的IoC功能。但Struts2框架本身也提供了IoC的功能。IoC(Inversion of Control),随着Java社区中轻量级容器(Lightweight Contianer)的推广而越来越为大家耳熟能详。值得一提的是,Spring确实是一个值得学习的框架,因为有越来越多的开源组件,如iBATIS(新版本为Mybatis)等。都放弃与Spring重叠的功能的开发。因此,Struts 2推荐大家通过Spring实现控制反转。
控制反转(Inversion of Control,IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(DependencyInjection,简称DI)和依赖查找。依赖注入应用比较广泛。
1、依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。
2、依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型,其又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子(器)注入(ConstructorInjection)三种方式。【如想深入了解,需要读者自行拓展阅读】
值栈ValueStack是Struts2框架核心组件,它提供对上下文信息和执行环境中元素的访问机制。其在底层实现了一个栈,但与传统栈的实现有所不同。
值栈由以下4个层级对象组成:
(1) 临时对象:这些对象在请求处理过程中需要临时保存,比如集合中当前正在迭代的元素;
(2) 模型对象:当Action实现了ModelDriven接口时,模型对象就会被存放在栈中被执行的Action前面;否则不存在这个级别的内容;
(3) Action对象:此对象为当前正在执行的action;
(4) 命名对象:任何对象都可以被赋予一个标志符而成为命名对象。比如与HTTP同等作用域的对象集合对应的Struts2命名对象,#application、#session、#request、#attr和#parameters等。
值栈的使用方式:
栈的传统使用方式是压栈和出栈。对于值栈则是通过使用OGNL(ObjectGraph Navigational Language对象导航语言)语法编写的特定表达式来查找,或者是在该表达式之上求值。
OGNL表达式【该部分的应用,会在演示Demo中涉及】
常见用法:
(1) person.name 调用getPerson().getName()
(2) #session.user从会话对象中获取user属性对象
(3) #session.shopcart.size()获取会话中购物车的数量
(4) top 获取值栈最顶层对象 【该部分需要读者,自行拓展阅读】
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/35984507】第三步:添加并编辑struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 启动开发模式 --> <constant name="struts.devMode" value="true"/> <!-- <constant name="struts.objectFactory" value="spring" /> bean交spring管理 --> <!-- 为true可使用感叹号调用方法,官网不推荐 --> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 加载src/config/struts2/ 目录下所有struts文件 注意命名格式 --> <!-- <include file="config/struts2/struts-*.xml"></include> --> <include file="config/struts2/struts-test.xml"></include> </struts>
1、 非IOC方式Action
/** * 非IoC方式Action * @author Mahc */ public class UnIOCmode { private String message; private ArrayList<Person> persons = new ArrayList<Person>(); public String method() { // 获得ActionContext实例,以便访问Servlet API ActionContext ctx = ActionContext.getContext(); // 获取Parameter // Map paramMap = ctx.getParameters(); 获取的对象为String[] if(null!=ctx.getParameters().get("msg")){ String[] msg = (String[])ctx.getParameters().get("msg"); System.out.println(msg[0]); } // Java Servlet HttpServletRequest 对象操作 String servletMsg = ServletActionContext.getRequest().getParameter("msg"); System.out.println(servletMsg); // // ctx.getParameters().put("msg", "parameter信息"); 待检测 // 向application域存入数据 // Map<String, Object> applicationMap = ctx.getApplication(); ctx.getApplication().put("msg", "application信息"); // 向session域存入数据 // Map<String, Object> sessionMap = ctx.getSession(); ctx.getSession().put("msg", "seesion信息"); // 向request域存入数据 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("msg", "request信息"); ////////////////////////////////////////// System.out.println("Struts2 非IOC 配置成功!"); message = "Success"; ////////////////////////////////////////// Person p = new Person(); p.setAge(25); p.setBirthday(new Date()); p.setName("pla1"); persons.add(p); // 为persons赋值 for(int i=1;i<4;i++){ Person person = new Person(); person.setAge(19+i); person.setBirthday(new Date()); person.setName("pla"+i); persons.add(person); } return "msg"; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public ArrayList<Person> getPersons() { return persons; } public void setPersons(ArrayList<Person> persons) { this.persons = persons; } }
/** * IOC方式Action * @author Mahc */ public class IOCmode extends ActionSupport implements ServletRequestAware ,SessionAware,ApplicationAware,ParameterAware{ private HttpServletRequest request; private Map<String,Object> sessionMap; private Map<String,Object> applicationMap; private Map parameterMap; private ArrayList<Person> persons = new ArrayList<Person>(); private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setSession(Map<String, Object> session) { sessionMap = session; } public void setApplication(Map<String, Object> application) { applicationMap = application; } public void setParameters(Map<String, String[]> parameter) { parameterMap = parameter; if(null!=parameterMap.get("ioc_msg")){ String[] ioc_msgs = (String[]) parameterMap.get("ioc_msg"); System.out.println("ioc_msg========="+ioc_msgs[0]); } } public String method(){ // 向application域存入数据 applicationMap.put("ioc_msg", "application信息_ioc"); // 向session域存入数据 sessionMap.put("ioc_msg", "session信息_ioc"); // 向request域存入数据 request.setAttribute("ioc_msg", "request信息_ioc"); ////////////////////////////////////////// System.out.println("Struts2 IOC 配置成功!"); message = "IOC_SUCCESS"; ////////////////////////////////////////// //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ Person p = new Person(); p.setAge(25); p.setBirthday(new Date()); p.setName("pla1"); persons.add(p); // 为persons赋值 for(int i=1;i<4;i++){ Person person = new Person(); person.setAge(19+i); person.setBirthday(new Date()); person.setName("pla"+i); persons.add(person); } //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ return "IOC_SUCCESS"; } public ArrayList<Person> getPersons() { return persons; } public void setPersons(ArrayList<Person> persons) { this.persons = persons; } }
【IOC.jsp对应IOC方式,unIOC.jsp对应非IOC方式】
1、 unIOC.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>首页</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <p> parameters: <s:property value="#parameters.msg" /> </p> <p> request.msg: <s:property value="#request.msg" /> </p> <p> session.msg: <s:property value="#session.msg" /> </p> <p> application.msg: <s:property value="#application.msg" /> </p> <p> attr.msg: <s:property value="#attr.msg" /> </p> <hr /> <%=request.getAttribute("msg")%> ${message} <h3> 用于过滤和投影(projecting)集合 </h3> <p> 年龄大于20 </p> <ul> <!-判断年龄--> <s:iterator value="persons.{?#this.age>20}"> <li> <s:property value="name" /> - 年龄: <s:property value="age" /> </li> </s:iterator> </ul> <p> 姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]" /> </p> <hr /> <h3> 构造Map </h3> <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /> <p> The value of key "foo1" is <s:property value="#foobar['foo1']" /> </p> <hr /> <h4> %符号的用法 </h4> <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /> <p> The value of key "foo1" is <s:property value="#foobar['foo1']" /> </p> <p> 不使用%: <s:url value="#foobar['foo1']" /> </p> <p> 使用%: <s:url value="%{#foobar['foo1']}" /> </p> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>首页</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <p> parameters: <s:property value="#parameters.ioc_msg" /> </p> <p> request.ioc_msg: <s:property value="#request.ioc_msg" /> </p> <p> session.ioc_msg: <s:property value="#session.ioc_msg" /> </p> <p> application.ioc_msg: <s:property value="#application.ioc_msg" /> </p> <p> attr.msg: <s:property value="#attr.ioc_msg" /> </p> <hr /> <%=request.getAttribute("ioc_msg")%> ${message} <h3> 用于过滤和投影(projecting)集合 </h3> <p> 年龄大于20 </p> <ul> <!-判断年龄--> <s:iterator value="persons.{?#this.age>20}"> <li> <s:property value="name" /> - 年龄: <s:property value="age" /> </li> </s:iterator> </ul> <p> 姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]" /> </p> <hr /> <h3> 构造Map </h3> <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /> <p> The value of key "foo1" is <s:property value="#foobar['foo1']" /> </p> <hr /> <h4> %符号的用法 </h4> <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /> <p> The value of key "foo1" is <s:property value="#foobar['foo1']" /> </p> <p> 不使用%: <s:url value="#foobar['foo1']" /> </p> <p> 使用%: <s:url value="%{#foobar['foo1']}" /> </p> </body> </html>
struts-test.xml文件位于src/ config/struts2文件夹下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="test1" namespace="/test" extends="struts-default"> <action name="ioc_*" class="cn.mahaochen.web.IOCmode" method="{1}"> <result name="IOC_SUCCESS">/IOC.jsp</result> </action> <action name="unioc_*" class="cn.mahaochen.web.UnIOCmode" method="{1}"> <result name="msg">/unIOC.jsp</result> </action> </package> </struts>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Struts2.3.16 快速使用</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <style type="text/css"> body { text-align:center; } </style> </head> <body > <p><h3>Struts2.3.16 快速使用</h3></p> <hr /> <p><a href="test/unioc_method.action" >Struts2 非IOC方式</a></p> <p><a href="test/unioc_method.action?msg=123message321" >Struts2 非 IOC方式[含请求参数]</a></p> <p><a href="test/ioc_method.action" >Struts2 IOC方式 </a></p> <p><a href="test/ioc_method.action?ioc_msg=123message321" >Struts2 IOC方式[含请求参数]</a></p> <hr /> </body> </html>
http://127.0.0.1/StrutsDemo/test/unioc_method.action 非IOC方式测试
http://127.0.0.1/StrutsDemo/test/ioc_method.action IOC方式测试
下载演示项目 http://download.csdn.net/detail/ma_hoking/7561727
Struts 2相关配置与基本操作演示(案例Demo),布布扣,bubuko.com
原文:http://blog.csdn.net/mahoking/article/details/35984507