一、在动作类中访问Servlet的API
1、第一种方式:直接使用ServletActionContext类获取
可以看出Struts2对request进行了封装
2、第二种方式:使用注入的方式,实现拦截器注入,servletConfig
1、定义成员变量
2、实现接口
3、实现接口中的方法
二、分文件编写框架配置文件
1、不分文件开发可能产生的问题
就类似于我们在写java类时,所有代码都写在一个类里,甚至写在一个方法里。
<struts>
<include file="struts_usr.xml"></include>
<include file="struts_role.xml"></include>
</struts>
2、静态参数封装:使用注入给参数赋值
<pre name="code" class="html">
<struts>
<constant name ="struts.devMode" value="true"></constant>
<package name ="p1" extends="struts-default">
<action name="action1" class="com.lzh.web.action.TestAction" method="addUser">
<!-- 静态参数封装:使用注入给参数赋值
由拦截器实现的注入:staticParams拦截器
<span style="white-space:pre"> </span>中文不会乱码,因为在defaultStack中设置了编码
默认存在defaultStack中定义的拦截器,如果自己卸了拦截器,那么默认的都不存在了,只存在自己写的拦截器-->
<param name="username">王小二</param>
<param name="age">20</param>
</action>
</package>
</struts>
3、动态参数封装
动态参数封装的第一种方式:
直接在动作类中定义参数:参数和动作类绑定在一起
由拦截器执行的注入params
<struts>
<constant name ="struts.devMode" value="true"></constant>
<package name ="p1" extends="struts-default">
<action name="action1" class="com.lzh.web.action.TestAction" method="addUser">
</action>
</package>
</struts>
表单上name属性的值必须和动作类中set方法后的名字一致
动态封装参数的第二种方式
实现参数的动作类的分离
注意:页面上name属性的值需要时user.username,user.age
拦截器实现的注入params
getUser:拦截器不知道是否有User对象,先判断有没有User对象,知识判断有没有,如果没有会使用
反射创建一个对象
setUser:拦截器把使用反射创建的对象赋给动作对象中的user成员
getUser:得到User对象
user.setUserName(),user.setAge()
如果User user = new User()
getUser:先判断有没有对象,结果有,并没有得到User对象
getUser:得到User对象
<struts>
<constant name ="struts.devMode" value="true"></constant>
<package name ="p1" extends="struts-default">
<action name="action2" class="com.lzh.web.action.TestAction" method="addUser">
</action>
</package>
</struts>
动态封装参数的第三种方式
使用模型驱动封装参数:最终使用的方式
必须满足的前提条件:动作必须和参数分离
1、实现接口
public class TestAction3 extends ActionSupport implements ModelDriven<User>{
User user = new User()//必须自己创建对象(下图忘加)}
2、实现接口中的方法
jsp里
拦截器