动态方法的开启
2种方法
1、<action name="helloAction_*" class="com.hd.action.hello" method=”{1}”>
*号占位符
2.开启常量
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
Method不写,然后在地址栏地址名和方法名用!号隔开
注意:
在高版本的struts2不能使用
<allowed-methods>hello</allowed-methods>
默认设置
属性的默认值
<!—
method 如果不写 自动匹配该类中的execute方法
class 默认的是ActionSupport
result -> name 不写 默认的是success
type 默认的是转发
-->
默认访问的action
<default-action-ref name="defaultAction"></default-action-ref>
Struts2的访问流程
1、
到达web.xml struts2过滤器
过滤器会自动过滤src目录下的struts.xml文件
进入到该类,并执行对应的方法
返回结果
Struts.xml中
读取result中的type属性 打开后面的页面
Action类的创建
1、Pojo类
2、继承 ActionSupport 比接口多了一些action的优化 推荐使用
3、实现接口:Action接口
Struts2接收参数
1、struts2是一个线程安全
它的生命周期是每次请求到来,都会重新创建action
接收参数的方式
1、属性驱动
在action类中创建属性,属性的名字必须和参数的名字保持一致
自动接收参数
给该属性创建对应的get-set方法
2、对象驱动
属性中添加对象并设置get-set方法
在传参数过程中,必须使用对象导航的方式
对象user 参数 user.name 这样name属性会自动封装到对象user中
3、模型驱动
实现modelDriver<Object>接口 泛型传递要转换的对象类型
实现它的方法, 方法中有个返回值,返回对应的属性
在action汇总定义一个属性,并给它new出来一个对象
模型驱动不能转换集合, 对象驱动可以转换集合
响应请求
1、转发
2、重定向
3、转发自己的action chain
<result name="success" type="chain">
<param name="actionName">toAction_add</param>
<param name="namespace">/</param>
<param name="name">${name}</param>
</result>
4、重定向到自己写的action
<result name="success" type="redirectAction">
<param name="actionName">toAction_add</param>
<param name="namespace">/</param>
<param name="name">${name}</param>
</result>
5、ajax
Ajax请求
1、 Servlet常用的对象
request 生命周期 请求到来创建
response
session request.getSession() 生命周期 30分钟后销毁
servletContext 服务器开启对象就创建 服务器关闭就销毁
2、struts2中action
ActionContext对象
Request原生对象
Response原生对象
ServletContext原生对象
Request域
Session域
ServletContext域 applicationContext
Param 域
Attr域 三合一 (Request域、Session域、ServletContext域)
2、steam流的方式
Action中添加属性 InputStream inputStream 给他添加对应的get-set方法
将json字符串转化为字节流并赋值给inputStream
private InputStream inputStream;
@Override
public String execute() throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code",0);
jsonObject.put("msg","你好,访问成功");
String str = jsonObject.toJSONString();
inputStream = new ByteArrayInputStream(str.getBytes("GBK"));
return super.execute();
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
在配置文件中设置type 为steam
加一个响应的的参数就是这个属性
<action name="steamAction" class="com.hd.SteamAction.SteamAction">
<result name="success" type="stream">
<param name="inputStream">inputStream</param>
</result>
</action>