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

基本介绍

Struts 2

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

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

Struts 2相关配置与基本操作演示(案例Demo),布布扣,bubuko.com

时间: 2024-12-28 15:37:06

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

Struts2 struts.xml相关配置

<?xml version="1.0" encoding="UTF-8" ?> <!--指定struts2配置文件的DTD信息--> <!DOCTYPE struts PUBLIC "-//apache Software Foundation//DTD Struts Configuation 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd&quo

solr相关配置(搜索novel案例)

managed-schema <?xml version="1.0" encoding="UTF-8" ?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional inform

HAProxy介绍和相关配置演示

HAProxy提供高可用性(体现在可以对后端RS的健康检查).负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. HAProxy实现了一种事件驱动.单一进程模型,此模型支持非常大的并发连接数.

Mysql中主从复制的原理、配置过程以及实际案例

Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6.7_64位操作系统,并分别在两台服务器上安装mysql.我的IP地址分别为:192.168.1.15/192.168.1.16,这里我定义15为主服务器,16为从服务器.首先,我们编辑主服务器中mysql配置文件.(因我的mysql使用非root用户安装,因此配置文件放在/home/formal/

Gitlab企业代码管理服务安装及相关配置

1.安装过程 登陆www.gitlab.cc网站,根据你的系统,选择不同的安装 演示的过程是在Centos6上的配置 A.yum install curl openssh-server postfix cronie(邮箱配置另行说明,如果使用postfix,请下载安装,如使用第三方的企业邮箱,则无需安装) B.curl http://packages.gitlab.cc/install/gitlab-ce/script.rpm.sh | sudo bash C.yum install gitla

Struts 2零配置

从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行配置,甚至不需要使用Annotation进行配置,而是由struts2根据约定自动配置. 如何使用Convention 1.       将struts-Convention-plugin-2.1.6.jar文件复制到WEB-INF/

struts2之day01——04Struts2相关配置

struts2之day01--04Struts2相关配置 一.Struts2核心配置文件: 1.名称和位置是固定的: 2. 在配置文件中主要的三个标签:package.action.result,标签里面的属性: 二.struts.xml中的三个主要标签 标签package: 1.类似于代码包,区别于不同的action,必须首先写package标签,在package里面才能配置action 2.Package标签属性 (1)name属性: *name属性值根本功能本身没有关系的,在一个配置文件中

NFS服务器原理和安装配置详解附案例演练

NFS服务器原理和安装配置详解附案例演练 1.什么是NFS服务器 NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器.不同的操作系统可以共享彼此的文件. NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利: 2.NFS挂载原理 NFS服务器的挂载结构图: 如上图示: 当我们在NFS服务器设置好一个共享目录/home/public后

apache2.4限定某个目录禁止解析PHP、限制user_agent、PHP相关配置

限定某个目录禁止解析PHP 对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如服务器可以上传图片,并且没有做防盗链,所以就会被人家当成了一个图片存储服务器,并且盗用带宽流量.如果网站代码有漏洞,让黑客上传了一个用PHP代码写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限,为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码(不用担心会影响网站访问,若这种目录也需要解析PHP,那说明程序员不合格) 1. 修改虚拟主机配置文件 [[email prot