Struts2是一个基于MVC设计模式的Web应用框架,Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求。
Struts 2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Struts2整合了OGNL(Object Graph NavigationLanguage)表达式(对象图形导航语言)。
Struts2使用“ValueStack”技术(值栈)。
拦截器:拦截是AOP的一种实现策略。在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延
续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从
而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
AOP详细:http://www.tuicool.com/articles/QNny6r 或者 http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html
环境,jar包
核心包 | struts2-core-2.3.28.1 | strut2框架核心类库 |
xwork-core-2.3.28.1 | webwork核心包,strut2基于webwork | |
ognl-3.0.14 | ognl表达式支持包,用于读写 对象属性 | |
依赖包 | commons-fileupload-1.3.1 | 文件上传组件 |
commons-io-2.2 | 文件传输依赖包 | |
commons-lang3-3.2 | 对java.lang 包增强 | |
javassist-3.11.0.GA | 代码生成工具,运行时扩展java类 | |
freemarker-2.3.22 | UI标签模板 | |
commons-logging-版本.jar | ASF出品的日志包,在这里支持log4j和jdk日志记录 | |
log4j-1.2.17.jar | 日志处理 | |
asm-3.3.jar | 字节码读写 | |
asm-commons-3.3.jar | 基于事件的表现形式 | |
asm-tree-3.3.jar | 基于对象的表现形式 |
maven 创建struts2 的项目
1.添加jar包依赖
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.16.3</version>
</dependency>
2.配置web.xml 添加过滤器 让所有的请求都经过struts2处理
StrutsPrepareAndExecuteFilter 核心控制器
<!-- 添加过滤请求 交由struts2处理-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
备注: init() 读取配置资源和常量
destroy() 销毁占用资源
doFilter() struts2入口
3.添加对应的请求的类 继承 ActionSupport类 (也可以使用实现Action接口)重写 excute的方法
public class LoginAction extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
4.添加struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundataion//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="helloworld" extends="struts-default">
<action name="helloworld" class="com.controller.LoginAction">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
5.测试 发送helloworld请求-》到对应的xml中找匹配的action
->交给对应的action类来处理 ->重写了action的excute方法->返回对应的result
->在找struts.xml中匹配的result来处理->jsp
Struts2 可以配置开发模式
好处 修改XML文件后无需在次重启,能够显示更多的信息
缺点 运行效率降低
<!-- 设置开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 热部署 -->
<constant name="struts.configuration.xml.reload" value="true"/>
xml:配置说明:
<struts>下面可以多个package package可以有多个action
package 主要用分包管理
name 名字 名字要见名知意
namespace 请求空间 相当在请求上面多加一个请求的地址(叫做请求前缀也可以)
extends 继承某个文件
name 代表着请求路径
class 由哪一个action 类来处理
method 表明该请求由哪一个方法来进行处理
Action 路径(命名空间):
相对路径:namespace + / + action.name
绝对路径:http://localhost:8080/project/namespace + / + action.name
动态调用
package action;
import com.opensymphony.xwork2.ActionSupport;
public class EmployeeCrudAction extends ActionSupport {
public String create() {
System.out.println("employee create");
return SUCCESS;
}
public String retrieve() {
System.out.println("employee retrieve");
return SUCCESS;
}
public String update() {
System.out.println("employee update");
return SUCCESS;
}
public String delete() {
System.out.println("employee delete");
return SUCCESS;
}
}
package action;
import com.opensymphony.xwork2.ActionSupport;
public class StudentCrudAction extends ActionSupport {
public String create() {
System.out.println("student create");
return SUCCESS;
}
public String retrieve() {
System.out.println("student retrieve");
return SUCCESS;
}
public String update() {
System.out.println("student update");
return SUCCESS;
}
public String delete() {
System.out.println("student delete");
return SUCCESS;
}
}
xml
<package name="default" namespace="/" extends="struts-default">
<action name="employee" class="action.EmployeeCrudAction">
<result>/index.jsp</result>
</action>
<action name="student" class="action.StudentCrudAction">
<result>/index.jsp</result>
</action>
</package>
jsp:
<body>
<h1>测试DMI动态方法调用</h1>
<a href="employee!create.action">增加员工</a><br/>
<a href="employee!retrieve.prop">查询员工</a><br/>
<a href="employee!update.aaa">修改员工</a><br/>
<a href="employee!delete">删除员工</a><br/>
<hr />
<a href="student!create">增加学员</a><br/>
<a href="student!retrieve">查询学员</a><br/>
<a href="student!update">修改学员</a><br/>
<a href="student!delete">删除学员</a><br/>
</body>
Action的创建方式:
优点:可以使用Action中的常量;必须实现execute方法
优点:包含2的优点;提供数据校验,国际化,序列化等功能。
结果集:http://blog.csdn.net/jwq525727/article/details/5036954 详细类型