Struts2访问流程
1.从浏览器输入地址
2. 进入到web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
3. struts2过滤器去加载配置文件struts.xml
4. 路径中的第一个地址namespace遍历你的struts.xml中包package namespace
属性如果他找到了和地址匹配的就进入到该包,如果没有找到就报异常
5. 找到了该package再去路径取后面的地址 然后package 找action 的name属性如果找到匹配的,就进入到该action配置的Action 类中
6. 通过action的method属性去执行Action类对应的方法
7. 根据执行的action类中的方法获得返回值 然后回到struts.xml里面的result标签 通过 读取result中的配置打开对应的页面
Action类的创建
总共有三种方式
1. pojo类
/*
1.pojo类的创建方式(Plain Ordinary Java Object)
典型的普通的Java对象 没有实现接口 没有继承 这样的方式就是pojo
类
低侵入性 比servlet这种继承的要好
*/
public class HelloAction {
public String hello(){
System.out.println("hello Struts2");
return "success";
}
}
1. 实现Action接口
/*
2实现一个接口
实现execute方法
为什么这么设计?
第一点让你知道默认访问的是execute方法
第二点告诉你如何书写action类中的方法
权限pulbic 返回值类型String
接口中定义了一些特殊的常量这些常量当成是我们的返回值
*/
public class Demo1Action implements Action{
@Override
publicString execute() throws Exception {
return null;
}
publicString update(){
return SUCCESS;
}
}
1. 继承ActionSupport类(推荐)
注意:action里面的方法 模板是固定 修饰权限是固定的 pulibc 返回值类型String
方法中不允许有参数
/**
* 3.继承 ActionSupport
*
* 因为它实现了很多接口,这些接口都是我们常用的,
* 这样就简化了我们的工作。
* 这种方式是我们所推荐的方式
*/
public class Demo2Action extends ActionSupport {
@Override
public String execute() throws Exception {
return super.execute();
}
}
页面的跳转方式
1. 转发
2. 重定向
3. 转发到自己的Action type变为chain
<result name="success" type="chain">
<!--跳转到下一个action的名字-->
<param name="actionName">targetAction</param>
<!--跳转到下一个action的命名空间-->
<param name="namespace">/</param>
</result>
4. 重定向到自己的Action type变为redirectAction
<action name="redirectAction"class="cn.hd.jump.RedirectAction" >
<result name="success" type="redirectAction">
<param name="actionName">targetAction</param>
<param name="namespace">/</param>
</result>
</action>
5. 不跳转 接收ajax请求
(1) 使用原生的servlet Api
ActionContext在struts2中 我们把它叫做数据中心
Requset 原生对象
Response 原生对象
Session 原生对象
ServletContext 原生对象
attr 原生对象
Requset 域 map Struts2不建议使用 如果要用就用ActionContext对象
Session 域 map
ServletContext APPlication 域 map
attr 域 map
ActionContext 生命周期
所有的servlset对象都存了,他的生命期是随着其中最短的人二创建和销毁的 也就是request
每次请求到来,ActionContext都会重新创建
所以他解决了线程安全问题
使用ServletApi相应ajax请求
1. 获得respone 对象(两种方法)然后就回到了原生态的servlet响应中
2. action中的方法的返回值必须是NONE(如果设为NONE那么在Struts.xml中就不写result标签了)
(2) Stream
1. 在Action类中 创建一个InputSrteam对象
2. 给这个对象增加 一个 get方法
3. Sturts.xml中的result标签中设置type = stream
4. Action最终可以将json字符串抓华为inputStream流
(3) 使用json插件
1. 导包
2 建立一个Action类
定义你想要返回的json的健名
生成get set方法
然后在Action访问的方法为这个json健名的对象进行赋值
3. 配置struts.xml文件
重新建package extends继承不能写 struts-default 要写json-default(在struts-json-plugin 包中)
Action 不变
result name 属性不变 type属性 变为 json(struts-json-plugin包的struts-plugin.xml中)
参数的接收
1. 属性驱动
原因:struts2是线程安全
在Action类中直接定义属性名 然后设置 get set方法
在访问的地方 传入 对应的属性名和值struts2自动接收
2. 对象驱动
定义一个bean类在Action定义一个对象 并且 加上get set 方法
并且 在请求的地方请求参数建值有规定 必须按照规定的对象名. 属性名方式传递
3. 模板驱动
需要实现ModuleDriver<User>接口
重写方法
在Action当中创建一个user对象,并且new对象
请求的地方还是按照请求的属性传递