Struts2框架入门
整理自一个文档 作者郝文龙 博客首页:https://me.****.net/a639735331
1.struts2简介
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
2.struts2环境搭
案例:struts001_hello
1.下载struts-2.3.14-all.zip开发包,解压到指定目录
2.打开apps
3.使用解压软件解压struts2-blank.war
4.复制lib下的jar包到自己项目(struts2-blank\WEB-INF\lib)
5.将web.xml中的配置添加到自己项目(struts2-blank\WEB-INF)
6.将struts.xml复制到自己项目并做修改(struts2-blank\WEB-INF\src\java)
<struts> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="hello"> <result> /hello.jsp </result> </action> </package> </struts> |
7.访问http://localhost:8080/struts001/hello
3.命名空间
命名空间决定了action的访问路径,命名空间一般和模块名保持一致
4. 指定处理请求的action
<struts> <package name="default" namespace="/" extends="struts-default"> <action name="hello" class="com.lq.action.HelloAction"> <result name="success"> /hello.jsp </result> </action> </package> </struts> |
Struts2的action一般是继承ActionSupport类,默认执行该类的execute()方法
public class HelloAction extends ActionSupport{ @Override public String execute() throws Exception { // TODO Auto-generated method stub return "success"; } } |
5.调用Action中方法的三种方式
案例struts002_method
5.1.为请求指定具体的方法
<action name="user" class="com.lq.action.UserAction" method="addUser"> <result name="success"> /success.jsp </result> </action> |
5.2.动态方法调用
user!addUser
感叹号后的addUser指定action中要调用的方法,action中不需要配置method
5.3.通配符
案例:struts003_dynamicmethod
public class UserAction extends ActionSupport{ public String add(){ return "success"; } public String delete(){ return "success"; } } |
<package name="default" namespace="/" extends="struts-default"> <action name="user*" class="com.lq.action.UserAction" method="{1}"> <result name="success"> /{1}_success.jsp </result> </action> </package> |
访问路径
http://localhost:8080/struts003/useradd
http://localhost:8080/struts003/userdelete
6.参数传递
6.1.属性作为action成员变量
案例:struts004_param
public class UserAction extends ActionSupport{ private String name; private int age; public String add(){ System.out.println(name); System.out.println(age); return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
测试:<a href="useradd?name=zs&age=20">接收参数</a>
6.2.model作为action属性
public class UserAction extends ActionSupport{ private User user; public String add(){ System.out.println(user.getName()); System.out.println(user.getAge()); return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } |
<a href="useradd?user.name=zs&user.age=20">接收参数</a>
请求是注意是 对象.属性
7.访问web元素
案例:struts006_webElement
访问web元素主要就是获取request session application
7.1.实现接口
public class UserAction1 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{ private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; @Override public String execute() throws Exception { request.put("k1", "v1"); session.put("k2", "v2"); application.put("k3", "v3"); return "success"; } public Map<String, Object> getRequest() { return request; } public void setRequest(Map<String, Object> request) { this.request = request; } public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this.session = session; } public Map<String, Object> getApplication() { return application; } public void setApplication(Map<String, Object> application) { this.application = application; } } |
7.2.通过ActionContext获取
public class UserAction2 extends ActionSupport{ private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application;
public UserAction2(){ request = (Map)ActionContext.getContext().get("request"); session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); } @Override public String execute() throws Exception { request.put("k1", "v1"); session.put("k2", "v2"); application.put("k3", "v3"); return "success"; } public Map<String, Object> getRequest() { return request; } public void setRequest(Map<String, Object> request) { this.request = request; } public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this.session = session; } public Map<String, Object> getApplication() { return application; } public void setApplication(Map<String, Object> application) { this.application = application; } } |
8.配置文件include
案例:struts007_include
实际开发中通常一个模块一个struts配置文件
<struts> <constant name="struts.devMode" value="true" /> <include file="struts_user.xml"></include> </struts> |
9.返回类型result_type
案例:struts008_result
Result最主要的功能是用来完成逻辑地址和物理地址映射, 通过result标签的type属性来设置结果类型,
9.1.Dispatcher
result属性默认值为dispatcher,表示请求转发到指定的jsp页面
9.2.redirect
表示重定向到jsp页面
9.3.chain
请求转发到指定的Action
9.4.redirectAction
重定向到执行的Action
注:当跳转的action不在当前namespace下时可以加参数
<result name="success" type="chain"> <param name="actionName">r1</param> <param name="namespace">/user</param> </result> |
9.5.全局配置
<!-- 全局配置,包下的所有action公用这个结果 --> <global-results> <result name="error">/error.jsp</result> </global-results> |
10.ognl
10.1.ognl访问普通属性
案例:struts009_ognl LoginAction1
10.2.ognl访问对象属性
案例:struts009_ognl LoginAction2
10.3.ognl访问list集合
案例:struts009_ognl LoginAction3
10.4.ognl访问web元素
非值栈对象 |
访问方式 |
等价访问方式 |
application |
#application.username |
application.getAttribute("username") |
session |
#session.username |
session.getAttribute("userName") |
request |
#request.username |
request.getAttribute("username") |
parameters |
#parameters.username |
request.getParameter("username") |
attr |
#attr.username |
pageContext–>request–>session–>application |
11.struts标签
在使用前需要在页面开始引入标签库,<%@ taglib prefix="s" uri="/struts-tags"%>
1. property标签
property标签提供了一种将属性写到页面的的方法
属性 |
是否必须 |
类型 |
描述 |
value |
否 |
Object |
需要显式的值,默认为栈顶对象。 |
default |
否 |
String |
value为空时显式的字符串,默认值为null。 |
2.set标签
Set标签用于在某个范围内声明一个变量并赋值,或者给一个属性设置别名
属性 |
是否必须 |
类型 |
描述 |
var |
是 |
String |
别名/引用 |
value |
否 |
Object |
设置别名代表的表达式或值 |
scope |
否 |
String |
指定别名被放置的范围,该属性可以接受application、session、request、page或action这五个值,默认值为action,即放在ActionContext中。 |
3.date标签
date标签允许我们用快速简单的方式来格式化一个Date对象
属性 |
是否必须 |
类型 |
描述 |
format |
否 |
String |
指定日期的格式化格式。 |
name |
是 |
Object |
指定要格式化的日期值。 |
4.debug标签
用于辅助调试,它在放置该标签的页面上产生一个超链接,通过该链接可以查看到ValueStack和ActionContext中所有的信息
5.include标签
可以在当前页面中包含其他Web资源的输出
6. if、elseIf/elseif、else标签
用于进行分支控制的,用于根据一个布尔表达式的值,来决定是否输出标签体的内容
7. iterator标签
iterator标签用于遍历集合对象
属性 |
是否必须 |
类型 |
描述 |
value |
否 |
Object |
被遍历的对象。 |
var |
否 |
String |
每次迭代到的对象以该名字存在于ActionContext中。 |
begin |
否 |
int |
迭代的开始数值或开始索引。 |
end |
否 |
int |
迭代的结束数值或结束索引。 |
step |
否 |
int |
迭代步长。 |
status |
否 |
String |
当前迭代的状态。当前索引、当前对象的索引是奇数还是偶数等简单的信息,例如:#status.index:当前行的序号,从0开始;#status.odd 是否奇数行。 |
8. generator标签
generator标签可以将指定字符串按指定分隔符分隔成多个子串组成的集合,类似于split功能
属性 |
是否必须 |
类型 |
描述 |
val |
是 |
String |
用于分隔的原字符串 |
separator |
是 |
String |
分隔符 |
var |
否 |
String |
新集合在page范围中的名字,后续代码可引用。 |
count |
否 |
int |
用于迭代的最大元素个数。 |
12.拦截器
Struts2拦截器是AOP的一种体现,每个拦截器代表着一种通用任务,Action业务组件通过使用特定的拦截器将该拦截器的通用任务切入进Action
拦截器的工作流程分为三个阶段
1.做一些Action执行前的预处理任务。
2.将控制交给后续拦截器或调用Action返回结果字符串。
3.做一些Action执行后的后加工任务
Struts2提供了很多内建拦截器,配置信息在struts2-core-2.*.jar包下的struts-default.xml文件中
1. params拦截器
params拦截器用于将请求参数转移到ValueStack公开的属性上
2. servletConfig拦截器
servletConfig拦截器提供了一种将Servlet API对象注入到Action的方法
3. exception拦截器
exception拦截器用于捕获后续执行过程中抛出的异常,exception拦截器会创建一个ExceptionHolder对象存放异常信息,并把它放在ValueStack的最顶端
3. fileUpload拦截器
fileUpload拦截器将要上传的文件及其元数据从多重请求转换为常规的请求参数,让我们既能获得常规数据,也能获得文件数据
13.类型转换
基本数据类型和包装类可以直接转换,事实上我们一直在使用这些内建的类型转换器。