Struts2 学习笔记

属性驱动模式:
params拦截器赋值
Action中的属性要和表单元素name属性相同。

    <form action="login111.action">
    用户名<input type="text" name="username"/><br/>
    密码<input type="text" name="password"/><br/>
    <input type="submit" value="提交"/>
    </form>

    private String username;
    private String password;

模型驱动模式ModelDriven:
ModelDriven拦截器实现。
继承关系:ModelDrivenInterceptor—>>>AbstractInterceptor—>>>Interceptor

1.Action实现ModelDriven<T>,并实现接口中的getModel方法。
2.在Action中实例化一个User,并且通过getModel()返回。
    <form action="login111.action">
    用户名<input type="text" name="username"/><br/>
    密码<input type="text" name="password"/><br/>
    <input type="submit" value="提交"/>
    </form>

推荐使用:

1.在Action中声明一个用户,并生成get,set方法
    private User user;

    private User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
2.修改表单元素的名字,使用user.属性
    用户名<input type="text" name="user.username"/><br/>
    密码<input type="text" name="user.password"/><br/>

在struts2中result的name属性默认为success

<result>/login_success.jsp</result>
<result name="success">/login_success.jsp</result>

实现com.opensymphony.xwork2.Action接口的好处:

可以使用Action中的定义好的常量,并且必须实现execute方法

struts2配置信息:

struts.configuration.xml.reload=false:struts2的xml文件在更新之后是否重新加载的配置.
struts.devMode = false:struts开发者模式,错误页面相对友好。

修改方式1(属性文件修改):

1.在classpath下新建struts.properties属性文件.
2.属性文件中写入struts.configuration.xml.reload=true

修改方式2(xml文件修改):

在struts2.xml中进行修改

<constant name="struts.configuration.xml.reload" value="true"/>

修改方式3(web.xml文件修改):

<init-param>
    <param-name>struts.configuration.xml.reload</param-name>
    <param-value>true</param-value>
</init-param>

struts2支持配置文件模块化:

<include file="struts-user.xml"/>

在struts2中操作Servlet API:(包括HttpServletRequest,HttpServletResponse,HttpSession)

1.通过ActionContext获取.(***没有侵入性是指没有侵入servletAPI)
    a.获取session(不是httpSession)Map map = ActionContext.getContext().getSession().put("userLogined", user);
    b.获取request  ActionContext.getContext().put("userLoginedRequest", user);
    c.获取application
    d.直接获取表单元素String username = (String) ActionContext.getContext().getParameters().get("username");
2.通过ServletActionContext(具有侵入性)
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
3.通过实现接口获取request,response
    a.获取request 
        private HttpServletRequest request; 
        实现org.apache.struts2.interceptor.ServletRequestAware
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }
    b.获取response
        实现org.apache.struts2.interceptor.ServletResponseAware
        private HttpServletResponse response;
        public void setServletResponse(HttpServletResponse response) {
            this.response = response;
        }
    c.获取ServletContext
        实现org.apache.struts2.util.ServletContextAware
        private ServletContext context;
        public void setServletContext(ServletContext context) {
            this.context = context;
        }

struts2的命名空间namespace:

struts2默认命名空间为  namespace="/"
struts2资源的访问路径      项目名(/)+namespace+action:struts2_1125/user/sdfsdf/sdfsdf/add.action
struts2命名空间查找会一层层的逐级查找知道找到根目录下(/)为止

struts2全局的result

    <global-results>
        <result>/add_success.jsp</result>
        <result name="error">/login_error.jsp</result>
    </global-results>   

struts2中其他方法的调用:

1.通过修改action标签中的method属性实现
<action name="delItem" class="com.neu.action.ItemAction" method="delItem">
注意:在Action中定义的其他方法,也需要个execute方法一样,有一个String类型的返回值。throws Exception
**并且一定不要有参数。
也可以使用缺省适配器模式继承ActionSupport类,但注意ActionSupport的execute方法只能成功。
2.通过动态方法调用实现(基于约定的)
    a.允许struts2使用动态方法调用配置
        <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    b.修改struts2配置文件
        <action name="itemAction" class="com.neu.action.ItemAction">
            <result>/add_success.jsp</result>
        </action>
    c.表单的提交位置      Action名称!方法名.action
        <form action="item/itemAction!addItem.action">
    好处:减少action的配置量,坏处:url地址过于复杂。

3.使用通配符调用方法注意基于约定
    1.<action name="*Item" class="com.neu.action.ItemDyAction" method="{1}">
        <result>/{1}_success.jsp</result>
    </action>
    2.<form action="item/addItem.action">
    3.Action类中的方法需要命名为add

struts2上传:

1.上传必须的jar包两个:commons-fileupload-1.3.1.jar,commons-io-2.2.jar
2.在页面中写入表单文件域
    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="myFile"/>
        <input type="submit" value="上传"/>
    </form>

struts2类型转换器:

1.局部类型转换器
    a.新建一个转换器类并继承StrutsTypeConverter,实现其中两个方法
         convertFromString() 将String转换成其他格式
         convertToString  将其他格式转换成String
    b.在需要应用的action同路径下建立属性文件 注意:属性文件命名必须为:XXXAction-conversion.properties
        eg:QueryEmpAction-conversion.properties
    c.在属性文件中写入
        beginDate=com.neu.convertor.UtilDateConvertor

2.全局类型转换器
    a.新建一个转换器类并继承StrutsTypeConverter,实现其中两个方法
         convertFromString() 将String转换成其他格式
         convertToString  将其他格式转换成String。注意:需要配合strtus2标签一起使用才能生效
    b.需要在src classpath下新建属性文件
        文件名称命名为:xwork-conversion.properties
    c.java.util.Date=com.neu.convertor.UtilDateConvertor

如果全局和局部同时存在,就近原则以局部为准。

strtus2的标签使用(对应jstl标准标签库):

1.通过taglib指令引入标签库<%@taglib uri="/struts-tags" prefix="s"%>
    标签库定义的位置:struts2-core-2.3.29.jar/META-INF/struts-tags.tld
2.通过<s:使用

struts2中的异常处理:

1.局部异常处理(action中)
    <action name="login"  class="com.neu.action.LoginAction" method="login">
        <exception-mapping result="error" exception="com.neu.exception.UserNotFoundException"></exception-mapping>
        <result>/login_success.jsp</result>
        <result name="error">/login_error.jsp</result>
    </action>
2.全局异常处理:
    <global-results>
        <result name="error">/login_error.jsp</result>
    </global-results>
    <global-exception-mappings>
        <exception-mapping result="error" exception="com.neu.exception.UserNotFoundException"></exception-mapping>
    </global-exception-mappings>

struts2自定义拦截器:

1.创建拦截器类MyInterceptor使其继承自拦截器类AbstractInterceptor体现缺省适配器模式
也可以直接实现Interceptor接口。
2.在struts2.xml中使用interceptor标签配置。
    a.      <!-- 将拦截器先声明 -->
            <interceptors>
                <interceptor name="my" class="com.neu.interceptor.MyInterceptor"/>
            </interceptors>

    b.  将声明好的拦截器应用到Action上去
            <action name="login" class="com.neu.action.LoginAction" method="login">
                <interceptor-ref name="my"/>
            </action>
        注意:会覆盖之前的拦截器
        加入<interceptor-ref name="defaultStack"/>
        引入默认拦截器栈中的拦截器。

配置struts2的默认拦截器栈:

1.  <interceptors>
        <interceptor name="my" class="com.neu.interceptor.MyInterceptor"/>
    </interceptors> 
2.配置自定义拦截器mymydefaultStackdefaultStackmyInterceptorStackzha
3.使自定义拦截器生效: <default-interceptor-ref name="自定义拦截器名称"/>

默认的拦截器栈(一堆拦截器):

***struts2的Action为多例
***servlet为单例的

MethodFilterInterceptor:
使用:当前action需要拦截特定的方法或者放行特定的方法时使用。
excludeMethods 哪些方法放行
includeMethods 拦截哪些方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值