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】
參考案例
第二步:加入所需的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方式測试
界面截图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFob2tpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
相关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
參考文献
2、 http://blog.163.com/neu_lxb/blog/static/179417010201145104245861/
Struts 2相关配置与基本操作演示(案例Demo)的更多相关文章
- Struts2中struts.multipart.maxSize配置
今天使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制 ...
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...
- phonegap环境配置与基本操作
一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...
- Mysql中主从复制的原理、配置过程以及实际案例
Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6 ...
- vi代码智能提示功能及相关配置
vim是一款支持插件.功能无比强大的编辑器,无论你的系统是linux.unix.mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding.如果能把vim用好了,不仅编程效率能得 ...
- SpringCloudConfig相关配置简介、使用、整合Eureka
目的: 1.SpringCloud Config简介 2.Config Server基本使用 3.Config Client基本使用 4.Config整合Eureka 5.Config配置搜索路径 S ...
- JavaWeb_(Struts2框架)struts.xml核心配置、动态方法调用、结果集的处理
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- zookeeper集群的搭建以及hadoop ha的相关配置
1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...
- Linux网络相关配置
一.修改网卡相关配置 Linux网络参数是在/etc/sysconfig/network-scripts/ifcfg-eth0中设置,其中ifcfg-eth0表示是第一个网卡,如果还有另外一块网卡,则 ...
随机推荐
- WinForm 自动完成控件实例代码简析
在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了. TextBox控件本身是提供了一个自动提示功能,只要用上这三个属性: AutoComple ...
- Node.js SDK与fabric链码交互开发
1.本篇背景 前面已经对链码开发作了比较详细的介绍,并且对官方提供的 fabcar 链码进行了解读,本篇将介绍如何使用 Node.js SDK 与区块链网络中的链码进行交互. 本篇内容基本来自官方 H ...
- [转]PHP用mysql数据库存储session
From : http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2010/0226/4002.html 大部分使用php的人一旦应用到sessio ...
- CImg、libjpeg--介绍、配置(操作JPEG)
关于处理图片,之前写了两篇博客关于ImageMagick的: <ImageMagick–介绍> <ImageMagick–VS2015环境配置.开发(registrykeylooku ...
- JavaScript:Events
ylbtech-JavaScript:Events 1.返回顶部 JavaScript 事件参考手册 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. 事件句柄 HTML 4.0 的新 ...
- JavaScript:sort() 方法
ylbtech-JavaScript:sort() 方法 JavaScript sort() 方法 1. 定义和用法返回顶部 sort() 方法用于对数组的元素进行排序. 语法 arrayObject ...
- Java系列:JVM中的OopMap(zz)
调用栈里的引用类型数据是GC的根集合(root set)的重要组成部分:找出栈上的引用是GC的根枚举(root enumeration)中不可或缺的一环. JVM选择用什么方式会影响到GC的实现: 如 ...
- 使用Vue.js实现列表选中效果
实际项目中,我们会遇到很多类似的需求,一个列表,需要点击其中一条高亮显示.熟悉JQuery的同学说这个太简单了.可以给这个选中的element设置一个active的class.配合Css样式,让ac ...
- ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的, ...
- 阿里巴巴Java开发规约插件全球首发!(转)
https://mp.weixin.qq.com/s?__biz=MzI0NTE4NjA0OQ==&mid=2658355901&idx=1&sn=3169172bfc6819 ...