Struts2概述
- Struts2框架是应用在JavaEE三层结构中的web层的框架。(专门针对web应用)
- Struts2框架在Struts1和webwork基础上发展的全新框架。(webwork和struts1合作,借助struts1的名声,并更名为struts2)
- Struts2解决的问题:
之前在web阶段,做一个用户管理功能(即增删改查功能),要做添加功能,需要创建一个添加的Servlet;要做一个修改功能,需要创建一个修改的Servlet。但是这样做个关键的缺点,如果功能很多,需要创建很多的Servlet,如果有一万个功能,就需要创建一万个Servlet,后期的维护特别麻烦。
针对这个问题出现了Struts2框架,Struts2框架是解决这个问题的方案中,比较优秀的一种方案。还是做一个用户管理功能(即增删改查功能),按照原始的方案,每个功能都需要建一个Servlet。每次访问Servlet,相当于向Servlet发送一个请求(请求指的是访问路径并实现内容)。而在Struts2中,用过滤器拦截下用户的这些请求,但拦截器不需要我们自己来写,Struts2已经帮我们封装好,我们只需要配置即可。同时我们针对不同的操作即不同的请求,在一个类(action类)中写不同的方法。而在过滤器中,根据不同的操作即不同的请求,执行类中的不同方法。比如做添加的操作,则执行类中的add方法;比如做修改的操作,则执行类中的update方法。这样可以解决多个Servlet的问题。
注意:在web阶段,我们写的类叫做Servlet;在Struts2中,我们写的类叫action。
Struts2入门案例:
第一步:导入jar包
- 解压struts-2.3.24-all.zip,在lib中有所有的jar包,但不能把这些jar包都导入到项目中
- 到apps目录里面,找到示例程序,从示例程序中的lib目录,复制jar包-----放到web项目下WebRoot--WEB-INF--lib
第二步:创建action类
第三步:配置action类访问路径
- 创建struts2核心配置文件。核心配置文件的名称和位置是固定的。位置必须在src下面,名称必须为struts.xml
- 引入dtd约束
- action配置
第四步:配置Struts2过滤器
Struts2执行过程
以上述入门示例为例,画图分析:
查看源代码
查看Struts2过滤器源代码
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
1.过滤器在服务器启动时候创建,创建过滤器时候执行init方法
在init方法中主要加载配置文件,包含自己创建的配置文件(web.xml和struts.xml)和struts2自带的配置文件
Struts2配置
1.Struts2的核心配置文件-----struts.xml
<struts>
<package name="default" namespace="/" extends="struts-default">
<!-- 访问名称 -->
<action name="hello" class="cn.itcast.action.HelloAction">
<!-- 配置方法的返回值页面 -->
<result name="ok">/hello.jsp</result>
</action>
</package>
</struts>
1.名称和位置是固定的
2.在配置文件中主要有三个标签:package标签、action标签、result标签
package标签
- package标签类似于代码包,区别不同的action,要配置action,必须首先写package标签,在package里面才能配置action
- name属性:name属性值跟功能本身没有关系的,在一个配置文件中可以写多个package标签,name属性值不能相同
- extends属性:属性值是固定的:struts-default。写了这个属性之后,在package里面配置的类具有action功能
- namespace属性:package标签里面的namespace属性值和action标签里面的name属性值构成访问路径
action标签
- action标签配置action访问路径
- name属性:package标签里面的namespace属性值和action标签里面的name属性值构成访问路径;在package标签里面可以写多个action标签,但是action标签的name属性值不能相同
- class属性:action类全路径
- method属性:比如在action类里面默认执行的方法是execute方法,但是在action类里面写其他的方法,让action里面多个方法执行,使用method进行配置
result标签
- result标签根据action类的方法返回值,配置到不同的路径里面(页面或者其他action)
- name属性:和方法的返回值相同
- type属性:配置如何到路径中(请求转发或者重定向),type属性的默认值做请求转发
2.Struts2默认的常量位置(记住)
3.修改Struts2默认常量值
(1)常用的方式
在struts.xml中进行配置
(2)还有两种方式(了解)
- 在src下面创建struts.properties,进行修改
- 在web.xml进行配置
4.介绍最常用的常量
struts.i18n.encoding=UTF-8
(1)表单提交数据到action里面,在action可以获取表单提交数据
(2)表单提交数据有中文,有乱码问题,解决:post提交直接设置编码;get提交做编码转换
(3)如果在action获取表单通过post方式提交中文,中文乱码问题帮助解决了,不需要自己处理问题
Action编写方式
action编写有三种方式
- 第一种:创建普通类,这个类不继承任何类,也不实现任何接口
package cn.itcast.action;
public class HelloAction {
public String execute(){
System.out.println("execute被执行了");
return "ok";
}
}
- 第二种:创建类,实现接口Action
package cn.itcast.action;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
- 第三种:创建类,继承类ActionSupport,该类也继承了Action接口(一般使用)
package cn.itcast.action;
import com.opensymphony.xwork2.ActionSupport;
public class PersonAction extends ActionSupport {
}
Action的方法访问(重点)
访问action有三种方式实现
- 第一种:使用action标签的method属性,在这个属性里面写执行的action的方法
(1)创建action,创建多个方法
package cn.itcast.method;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport{
//添加
public String add(){
System.out.println("add.........");
return "none";
}
//修改
public String update(){
System.out.println("update........");
return "none";
}
}
(2)在action标签中,使用method属性进行配置
<package name="method" namespace="/" extends="struts-default">
<action name="add" class="cn.itcast.method.BookAction" method="add">
</action>
<action name="update" class="cn.itcast.method.BookAction" method="update">
</action>
</package>
(3)在浏览器中输入访问路径,即package标签下namespace+action标签下name
缺陷:action每个方法都需要配置,如果action里面有多个方法,需要配置很多action
- 第二种:使用通配符方式实现(重点)
在action标签里面的name属性,name属性值里面写通配符(*)
(1)创建action,创建多个方法
package cn.itcast.method;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport{
//添加
public String add(){
System.out.println("add.........");
return "none";
}
//修改
public String update(){
System.out.println("update........");
return "none";
}
}
(2)在action标签中,使用通配符(*)进行配置
<package name="method" namespace="/" extends="struts-default">
<!--
name属性值里面写通配符(*)
(1)执行action里面的add方法,访问book_add---使用book_*可以匹配到,*相当于编程add
(2)执行action里面的update方法,访问book_update------使用book_*可以匹配到,*相当于编程update
上面两个路径使用book_*都可以匹配到
-->
<action name="book_*" class="cn.itcast.method.BookAction" method="{1}"></action>
</package>
(3)在浏览器中输入访问路径,book_add或者book_update
通配符(*)理解:表示匹配任意内容
-----比如访问update,*可以匹配到
-----比如访问add,*可以匹配到
通配符(*)使用示意图:
- 第三种:动态访问实现(一般不用)
注意:
(1)如果action中方法有返回值,在配置文件中没有配置或者两者不匹配,出现错误
(2)在action中方法的返回值必须是String类型的,也可以没有返回值,在result标签中不需要配置(将返回值设置为“none”)