1. Struts2的定义
Apache Struts 2 is an open-source web application framework for developing Java EE web applications. It uses and extends the Java Servlet API to encourage developers to adopt a model–view–controller (MVC) architecture. ——from Wikipedia
Apache Struts 2是一个开放源代码,支持开发java EE应用的的Web应用框架。它使用和扩展java Servlet API,鼓励开发者采取模型–视图控制器(MVC)架构。——来自维基百科
2. 关于Struts2
- Struts2主要是基于webwork核心的
- Struts2已经逐步被SpringMVC替代,原因有SpringMVC的优点,自然也有Struts2的不足:参见
http://blog.youkuaiyun.com/chenleixing/article/details/44570681
3. Struts2起步
3.1 登录Struts官网下载(建下载Full Distribution完整版,技术支持可以下载Documentation相关文档)。
3.2 解压目录结构
apps->包含了基于Struts2的示例
docs->包含有Struts2技术支持的相关文档
lib->(重要)包含Struts2的核心类库,相关第三方插件类库
src->源码
3.3 主要jar包介绍
- Struts2-core-**.jar : Struts框架的核心类库
- Xwork-core-**.jar : command模式框架,webwork和struts2都基于xwork
- ornl-**,jar : 对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
- reemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
- commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
- commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件
- commons-io-2.0.1.jar:传文件依赖的jar包
- commons-lang-2.5.jar:对java.lang包的增强- javassist-3.11.0.GA.jar:动态代理的开发包。日本的(Jboss)。Hibernate也会用到
. 新建一个web项目,从apps中struts2-blank中lib下的jar包拷到项目lib下
4. 在web.xml中配置Struts2的核心Filter
```
<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>
```
在src下新建一个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.devMode" value="true"/> <package name="default" namespace="/" extends="struts-default"> <!--to login page--> <action name="toLogin" > <result>/login.jsp</result> </action> </package> </struts>
- 写一个动作类
public class OrderAction extends ActionSupport {
//bean
private OrderService orderService;
//bussiness
public String orderDetail(){
order = orderService.findOneById(id);
return SUCCESS;
}
//getter&setter
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
}
Struts2的相关配置文件
Struts2的配置文件体系
- default.properties:在struts2-core-**.jar的org.apache.struts包中
关于Struts2一些常量配置(框架内部) - struts-default.xml:在struts2-core-**.jar中。(框架内部)
定义了一些bean;
定义了一个抽象的包:struts-default
- 定义了一些结果视图类型
- 定义了一些拦截器和拦截器小组
- struts-plugin.xml :在struts2的第三方插件中(插件内部)
- struts.xml:用户自己编写的(重点)
- struts.properties:用户自己编写的(类路径中。不需要)
- web.xml:struts2的一些配置可以写在这(Web应用中。不需要)
default.prorerties
- 在struts2-core-**.jar的org.apache.struts包中
- 配置了一些关于Struts2一些常量配置(框架内部)
- 配置常量的方式(依次加载覆盖):
- 通过struts.xml(常用)
- 通过struts.properties
- 通过web.xml
常用属性:
请求相关
- 设置访问action的后缀
struts.action.extension=action,,
- 设置web默认字符编码集,对处理中文请求参数很有用
struts.i18n.encoding=UTF-8
文件上传相关
- 设置处理multipart、form-data的MIME类型
jakarta:使用common-fileupload文件上传框架(默认值)
struts.multipart.parser=jakarta
- 设置上传文件临时保存路径
struts.multipart.saveDir=
- 设置文件上传允许的最大字节数
struts.multipart.maxSize=2097152
开发时相关
- 设置是否使用开发者模式,在开发时设置true会提示更多,更友好的错误
struts.devMode = false
- 设置浏览器是否缓存静态类容(在开发时,如果希望每次都获得服务器最新响应,可可设置其为false)
struts.serve.static.browserCache=true
- 设置Struts是否支持动态方法调用
struts.enable.DynamicMethodInvocation = false
国际化
指定国际化资源文件,多个用,隔开
struts.custom.i18n.resources=testmessages,testmessages2
sturts-default.xml
在struts2-core-**.jar中。(框架内部)
- 定义了一些bean;
- 定义了一个抽象的包:struts-default
- struts-default下定义了一些结果视图
- 常用的结果视图:
- chain:转发到Action
- dispatcher:视图转发(默认)
- redirect:视图重定向
- redirectAction:重定向到Action
- stream:使用InputStream,常用于文件下载
- struts-default下定义了一些拦截器和拦截器小组(默认拦截器组defaultStack)
- struts-default设置了默认Action为com.opensymphony.xwork2.ActionSupport
struts.xml重点
struts.xml的骨架结构
注意点
配置action的method配置
1. 必须是public修饰的
2. 不可以带参数
3. 返回值必须是String
配置结果视图重定向到其它名称空间
```
<result type=”redirectAction” >
<param name=”namespace”>/house</param>
<param name=”actionName”>/addhouse</param>
</result>
```
param注入调用的是setter方法,故在注入类必须定义setter方法
自定义结果集
实现com.opensymphony.xwork2.Result接口,或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport
public class MyResultType implements Result { //由param注入 private int width ; private int height ; //必须要有setter public int getWidth() {return width;} public void setWidth(int width) {this.width = width;} public int getHeight() {return height;} public void setHeight(int height) {this.height = height;} //重写execute @Override public void execute(ActionInvocation invocation) throws Exception { //生成验证码 ValidateCode validateCode = new ValidateCode(width,height,4,10); String code = validateCode.getCode(); System.out.println("验证码:"+code); //怎么把验证码显示到页面 //怎么在struts2中使用servlet的api HttpServletResponse response = ServletActionContext.getResponse(); //把验证码展示到页面 validateCode.write(response.getOutputStream()); } }
- 配置struts.xml
<!-- 配置自定义结果视图 -->
<result-types>
<result-type name="yanzhengma" class="com.itqf.resulttype.MyResultType">
</result-type>
</result-types>
<!--将结果视图配置给action-->
<action name="showImg" >
<result type="yanzhengma">
<!-- 给自定义结果类型注入值 -->
<param name="width">500</param>
<param name="height">100</param>
</result>
</action>
访问Servlet API
方式一:通过ServletActonContext工具类:
//获得一个HttpServletRequest对象
HttpServletRequest request = ServletActionContext.getRequest();
//获得一个HttpServletResponse对象
HttpServletResponse response = ServletActionContext.getResponse();
//获得一个ServletContext对象
ServletContext servletContext = ServletActionContext.getServletContext();
//获得一个Session对象
HttpSession session = request.getSession();
方式二:通过ActionContext对象
//得到ActionContext对象
ActionContext actionContext = ActionContext.getContext();
//2通过ActionContext得到session域对象(一个map集合)
Map<String, Object> sessionMap = actionContext.getSession();
//获得application域对象
Map<String, Object> applicationMap = actionContext.getApplication();
//request对象
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
方式三:通过实现接口
- ServletContextAware:通过该接口可以直接访问ServletContext
- ServletRequestAware:访问HttpServletRequest
- ServletResponseAware:访问HttpServletResponese
//实现接口
public class MyAction3 implements ServletRequestAware {
//定义变量
private HttpServletRequest request;
//重写setter
public void setRequest(HttpServletRequset request){
this.request = request;
}
}
Page和Action间数据的交互
Action 接收Page的值
字段方式
page:
<form action="login1.action">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
action:
//1,把页面需要向动作类传值的字段声明出来
private String username;
private String password;
//2,设置get set方法(必须,因为是用注入的方式写入的)
通过Bean
page:
//注意name是对象名.字段名 OGNL表达式格式
<form action="login1.action">
用户名:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"><br>
<input type="submit" value="登录">
</form>
action:
//1.声明user类
private User user;
//2.设置getter&setter方法
...
通过Map
page:
//注意name是对象名.字段名 OGNL表达式格式
<form action="login1.action">
用户名:<input type="text" name="users['u1'].username"><br>
密码:<input type="password" name="users['u1'].password"><br>
<input type="submit" value="登录">
</form>
action:
//1.声明user类
private Map(String,Object) users;
//2.设置getter&setter方法
...
//3.取值
User user = (User)users.get("u1") ;
通过模型驱动
page和上面一样
action:
// 实现ModelDriven接口
public class LoginAction3 implements ModelDriven<User>{
//新建一个user对象
private User user = new User();
//重写getModel()方法
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
自定义转换器
- 继承org.apache.struts2.util.StrutsTypeConverter(最简单和方便)
- 覆盖convertFromString,convertToString方法
public class DataConvertor extends StrutsTypeConverter{
private DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd");
//字符串转Date
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
if(aClass == Date.class){
String date = strings[0];
try {
return dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
//日期转字符串
@Override
public String convertToString(Map map, Object o) {
if(o instanceof Date){
Date date = (Date)o;
return dateFormat.format(date);
}
return null;
}
}
- 编写配置文件
- 全局配置:
- 在src根目录下创建一个文件,名为xwork-conversion.properties:
- 配置com.util.Date=com.util.StudentConverter;
- 局部配置:
- 在需要使用该转换器的Action的目录下创建:
- date=com.util.StudentConverter(date为Action中的字段名)
- 全局配置:
Page访问Action数据
Struts ValueStack
Stack Context
OGNL表达式
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言,OGNL使用必须依赖struts标签支持。