• Struts 2相关配置与基本操作演示(案例Demo)


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/ma_hoking/article/details/35984507

    基本介绍

    Struts 2

           Struts 2Struts的下一代产品,是在 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

    Struts 2 IOC

               对于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)三种方式。【如想深入了解,须要读者自行拓展阅读】

    Struts 2 ValueStack(值栈)OGNL

            值栈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

    參考案例

    第一步:创建Web项目 StrutsDemo
    第二步:加入所需的jar文件(包)   參见【相关Jar文件】
    项目完整结构截图例如以下:




    第三步:加入并编辑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>

    第四步:编写Action 对象【本例涉及IOC与非IOC两种方式】

    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;
    	}
    }

    2、 IOC方式Action

    /**
     * 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; } }


    第五步:编写相关JSP页面 

    【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>


    2、 IOC.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.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>

    第六步:编辑Action相应XML文件(struts-test.xml)

    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>


    第七步:測试操作
    编辑index.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>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>


    測试用URL

            http://127.0.0.1/StrutsDemo/test/unioc_method.action    非IOC方式測试
            http://127.0.0.1/StrutsDemo/test/ioc_method.action       IOC方式測试

    界面截图


    相关Jar文件

    • struts2-core-2.3.16.jar
    • xwork-core-2.3.16.jar
    • commons-logging-1.1.3.jar
    • ognl-3.0.6.jar
    • commons-fileupload-1.3.jar
    • freemarker-2.3.19.jar
    • commons-io-2.2.jar
    • javassist-3.11.0.GA.jar
    • commons-lang-2.4.jar
    • commons-lang3-3.1.jar

    下载地址

    下载演示项目 http://download.csdn.net/detail/ma_hoking/7561727

    參考文献

    1、 http://www.java3z.com/cwbwebhome/article/article2/2938.html?

    id=1631
    2、 http://blog.163.com/neu_lxb/blog/static/179417010201145104245861/


    【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/35984507


  • 相关阅读:
    boost编译中的细节问题
    geos编译问题
    安装pytorch的细节记录
    Qt学习-模仿Qt实现一个colorbutton
    BOOST内存管理-intrusive_ptr
    GEOS使用记录
    matlab添加永久路径
    关于浮点数的取值范围以及精度的问题
    vs2010中使用命令行参数
    sprintf fprintf EOF scanf 的返回值 深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10858411.html
Copyright © 2020-2023  润新知