Struts2入门案例:
第一步 导入jar包
(1)找到apps目录,找到示例程序,从示例程序里面复制jar包:
随便改一个后缀为zip,然后点进去复制jar包;
第二步 创建Action
public class HelloAction {
public String execute() {
return "success";
}
}
总结:
(1)每次访问servlet的时候,servlet里面的service方法都会执行;
(2)每次访问struts2的action的时候,action默认都会执行名称是execute的方法;
第三步:配置Action核心配置文件:
(1)类似于servlet进行配置
(2)具体实现
- 创建struts2核心配置文件:名称和位置 是固定的
位置:必须在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>
<!-- 配置一个包:package -->
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置action -->
<action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">
<!-- 配置页面跳转 -->
<result name="success">/demo1/action1.jsp</result>
</action>
<action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
<!-- 配置页面跳转 -->
<result name="jump" type="redirectAction">/demo1/jump.jsp</result>
</action>
</package>
</struts>
访问action:
建议写上.action后缀名
浏览器访问:http://127.0.0.1/Struts2_day01_web1/hello.action
此时是无法访问的,因为还缺少一个过滤器。
第四步:配置struts2过滤器
(1)在web.xml中配置
<!-- 配置Struds2的核心过滤器:前端控制器 -->
<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>
访问Action的一个基本的流程:
什么是过滤器:
(1)什么是过滤器
- 在到达目标资源之前,进行操作
(2)过滤器在什么时候创建
- 服务器启动时间创建
(3)过滤器创建的时候,里面init方法执行
过滤器里面的init方法底层做的工作:
(1)加载struts2里面的配置文件
- 包含自己创建,和struts2自带配置文件
Struts2配置文件详解:
package标签:
1.如果在配置文件中,配置action访问的地址,首先必须写package标签;
(1)package标签用于区别不同的action
2 在一个配置文件中,可以写多个package标签,但是多个package标签的name属性值不能相同的
3 extends属性:
(1)extends属性值是固定的,必须是 struts-default
(2)写了这个值之后,package标签里面的类具有action功能
4 namespace属性:
(1)namespace属性值 和 action标签name属性值,构成访问路径名称
action标签:
1 action标签必须写在package标签里面
2 在一个package标签里面可以写多个action标签,但是action标签的name属性值不能相同的,例如:
<!-- 配置一个包:package -->
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置action -->
<action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">
<!-- 配置页面跳转 -->
<result name="success">/demo1/action1.jsp</result>
</action>
<action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
<!-- 配置页面跳转 -->
<result name="jump" type="redirectAction">/demo1/jump.jsp</result>
</action>
</package>
3 action标签name属性:
(1)namespace属性值 和 action标签name属性值,构成访问路径名称;
4 action标签class属性:
(1)action类的全路径
5 action标签method属性
(1)让action里面的不同的方法执行
result标签:
1 result标签:根据action的方法返回值,配置到不同的路径里面
2 result标签必须写到action标签里面,在一个action标签中可以写多个result标签,但是name属性值不能相同的
3 result标签name属性:和action的方法返回值对应
4 result标签type属性:
(1)表示如何到路径中(转发还是重定向)
(2)type属性常用的值
- 默认值,dispatcher,做转发操作
- redirect,做重定向操作(但是一般不会用这个值,而是用下面要介绍的)
(3)上面两个值 dispatcher和redirect,针对到页面中配置
如果到不同的action里面,需要其他值
- chain:不用,转发到action
- redirectAction:重定向到action里面
举例:
<action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
<!-- 配置页面跳转 -->
<result name="jump" type="redirectAction">/demo1/jump.jsp</result>
</action>
全局结果页面配置:
两个action方法的返回值,跳转到页面都是相同的,使用全局结果页面简化配置,进行如下配置:
局部结果页面:
1 在action标签里面使用result标签进行配置
2 配置全局结果页面,也配置局部结果页面,最终以局部为准
Action编写方式(三种):
action编写有三种方式
第一种方式:
创建普通类,不继承任何类,不实现任何接口
public class HelloAction {}
第二种方式:
创建类,实现接口Action
public class UserAction implements Action {
public String execute() throws Exception {
return null;
}
}
第三种方式(常用):
创建类,继承ActionSupport类(建议使用这种方式):
public class BookAction extends ActionSupport {
}
(1)ActionSupport类是接口Action的实现类
访问Action的方法:
1 在一个action里面可以有很多的方法,action默认执行的名称是execute的方法。如何执行action的其他的方法,例如:
public class BookAction extends ActionSupport {
public String add() {
return "add";
}
public String update() {
return "update";
}
}
2 访问action的方法有多种方式:
第一种: 使用action标签属性 method属性,在method属性值写 执行的action中的方法名称:
例如:
<action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
(1)使用第一种方式配置,缺陷:action里面每个方法都需要配置action
第二种:使用 通配符方式访问,使用method属性 (重点)
(1)使用符号进行配置,是 * 星号
- 在action标签的name属性值里面,写* ,星号匹配任意内容
-- 比如 访问 add,使用* 可以匹配
-- 比如访问 update,使用* 可以匹配
代码实现:
<!-- 配置action -->
<action name="*" class="cn.itcast.struts2.action.Struts2Day02" method="{1}">
<!-- 配置页面跳转 -->
<result name="toAddPage">/jsp/customer/add.jsp</result>
<result name="findAll">/jsp/customer/list.jsp</result>
<result name="success">/day2.jsp</result>
</action>
method="{1}" //表示*号这个方法在action中第一次出现的方法名;
常量配置和分模块配置:
常量配置:
修改struts2常量值有三种方式:
第一种:在struts.xml进行配置修改:例如:
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
第二种:在src下面创建struts.properties,进行配置
第三种:在web.xml中进行配置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
常用常量:
struts.i18n.encoding=UTF-8
(1)表单提交中文数据,有乱码问题
(2)比如post提交,调用设置编码
比如get提交,做编码转换
(3)封装功能:
- 如果表单提交方式是post,提交表单到action,在action获取post提交中文数据没有乱码问题,因为底层已经处理了post提交表单中的中文乱码问题,但是get提交的方式还是需要进行new String进行编码转换的。
分模块配置:
1 每个模块创建配置文件,把所有模块的配置文件,引入到核心配置文件中
需要注意的是,每一个被创建的配置文件都是标准的Struts2配置文件,一样包含DTD约束、Struts2配置文件的根元素等信息。
通过如下标签引入:
<!--引入模块配置文件-->
<include file="cn/itcast/action/book.xml"></include>
Action接收表单标签数据:
1 之前提交表单到servlet里面,在servlet中可以获取表单提交数据,调用request里面的方法得到
2 提交表单到action,可以在action获取表单提交数据,可以在action操作域对象
3 在action获取表单数据方式有很多种
(1)在action有ActionContext类获取
(2)在action有ServletActionContext类获取
下面是struts2里面封装实现操作
(1)属性封装
(2)模型驱动封装
(3)表达式封装
ActionContext类获取表单数据(不常用):
1 获取ActionContext独享,不是new出来的(通过静态方法得到给对象):
static ActionContext getContext();
2.调用ActionContext中的方法获取表单数据:
Map<String,Object> getParameters();
ServletActionContext类获取表单数据(常用,因为有request对象):
1.获得request对象:
HttpServletRequest request=ServletActionContext.getRequest();
//通过request对象获得表单数据
String username=request.getParameter("username");
封装表单数据:
1.属性封装:
1 可以在action成员变量位置定义变量,把表单提交数据封装到变量里面
2 实现步骤
(1)在action成员变量位置定义变量,变量名称规范:和表单输入项name属性值一样
(2)生成变量的set和get方法
如下所示: public ...... //定义变量 private String username; private String password; //生成set和get方法; .....
2.模型驱动封装(常用):
模型驱动是通过拦截器来实现的。
1 把表单提交数据直接封装到实体类对象里面
2 实现步骤
(1)让action实现接口,ModelDriven<实体类名称>
(2)实现接口里面的方法,getModel方法
(3)在action成员变量位置,手动创建实体类对象
注:要求:实体类属性名称 必须 和表单输入项中的name属性值一样。
代码演示如下: public class FormAction extends ActionSupport{ //创建实体类对象 private User user=new User(); public User getModel() { return user; } }
3.表达式封装:
1 把表单提交数据直接封装到实体类对象里面,在action中申明对应的实体类属性:
//1.声明实体类变量
private User user;
//2. 生成变量get和set方法:
public User getUser() {
return user;
}
public void setUser(User user) {
this.user=user;
} (2)需要在表单输入项name属性值中,写表达式形式,如下: <input type="text" name="user.username" /><input type="text" name="user.password" />
(2)需要在表单输入项name属性值中,写表达式形式,如下: