zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10858411.html
Copyright © 2011-2022 走看看