zoukankan      html  css  js  c++  java
  • struts2的基本使用

    struts2在web中当作前端控制器,接收来自页面的请求,使用过滤器拦截模式对请求进行拦截并交给相应配置的action类处理。

     

    所以在web中使用最重要的是struts2的核心过滤器StrutsPrepareAndExecuteFilter,需要配置在main/webapp/WEB-INF/web.xml中具体配置如下

     <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>

    filterclass是struts2提供的一个过滤器,前面已经提到是基于类(class)拦截的,所以与springmvc不同,springmvc是基于方法(method)拦截的。换种更加直观的说法来说:struts2的filter拦截 在你每提交一个request时它为你创建一个相应的Class,其中Class即是编写的Action ,而springmvc基于方法 即每次request只会被Method拦截不需要重复Class。这也是为什么在struts2和spring整合中struts的Action必须是Prototype(原型)的原因,关乎线程安全,每次spring需要为Action创建不同的Bean供请求处理。  struts的配置:

    配置文件应当放在classpath下

    struts.xml  配置有关struts的:

     

    这里想说一下 struts.xml中action中各参数 name=“UserAction_* 其中_* 是配合 method="{1}"一起使用的 代表进入_后面那个方法 如 UserAction_login 就是进入login方法 class必须是完整的类名,当然如果交给spring管理可以配置为spring的bean 名

    <?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>
    <!--下面这个配置只有在与spring整合才会使用 否则不用加--> <!--<constant name="struts.objectFactory" value="spring" />-->
    <!--说明: name 用于在有多个struts配置文件时彼此区分 namespace:‘/’代表根目录 配置意义是本配置文件中包含的Action及其他配置 不影响其他namespace下的Action等(这代表你可以在另一个strut2.xml配置中namespace=‘/one’下配置同名的action)
      extends :struts-default 是必须配置的 也可以extends自己的 但是很麻烦通常不要那样干
      -->
    <package name="dabai1" namespace="/" extends="struts-default"> <!-- 注册拦截器 拦截器栈 设置默认拦截器 --> <interceptors> <interceptor name="loginInterceptor" class="com.dabai.mall.filter.LoginInterceptor"></interceptor> <interceptor-stack name="loginStack"> <interceptor-ref name="loginInterceptor">
    <!--excludeMethods 指定某些方法不做拦截 很好理解 -->
    <param name="excludeMethods">login,register,read</param> </interceptor-ref>
    <!--defaultStack: 是struts内置的众多拦截器 下面会有说明-->
    <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- <default-action-ref name="loginStack"></default-action-ref> --> <!-- 设置全局结果集 --> <global-results> <result name="toLogin" type="redirect">/login.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="asd" exception="asd">/error.jsp </exception-mapping> </global-exception-mappings> <!-- 由于配置了struts.object value=spring --> <action name="userAction_*" class="com.dabai.mall.action.UserAction" method="{1}" scope="prototype">
    <!--这个login对应下面UserAction中return 的LOGIN 即对这个Action返回值="login"的请求 跳转到页面/login.jsp下 默认跳转方式是dispatcher 转发 可以在 name后配置 type=“redirect” 重定向
    还可以在Action中跳转 action中的跳转有的方式会丢失传递参数有的则不会 具体可以参考后面关于struts的内容-->
    <result name="login">/login.jsp</result> </action> </package> </struts>

    struts的默认拦截器栈及各个说明  可以只作了解 因为需要拦截器可以自己编写 通常会继承一个MethodFilterInterceptor类然后覆写其protected String  doIntercept(ActionInvocation arg0)方法需要注意的是filter放行需要逐个放行,只有前一个filter进行了arg0.invoke()下一个拦截器才能开始工作相当于原生的chain.dofilter()

     

     

    拦截器

    名字

    说明

    Alias Interceptor

    alias

    在不同请求之间将请求参数在不同名字件转换,请求内容不变

    Chaining Interceptor

    chain

    让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。

    Checkbox Interceptor

    checkbox

    添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

    Cookies Interceptor

    cookies

    使用配置的name,value来是指cookies

    Conversion Error Interceptor

    conversionError

    将错误从ActionContext中添加到Action的属性字段中。

    Create Session Interceptor

    createSession

    自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

    Debugging Interceptor

    debugging

    提供不同的调试用的页面来展现内部的数据状况。

    Execute and Wait Interceptor

    execAndWait

    在后台执行Action,同时将用户带到一个中间的等待页面。

    Exception Interceptor

    exception

    将异常定位到一个画面

    File Upload Interceptor

    fileUpload

    提供文件上传功能

    I18n Interceptor

    i18n

    记录用户选择的locale

    Logger Interceptor

    logger

    输出Action的名字

    Message Store Interceptor

    store

    存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

    Model Driven Interceptor

    model-driven

    如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

    Scoped Model Driven

    scoped-model-driven

    如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

    Parameters Interceptor

    params

    将请求中的参数设置到Action中去。

    Prepare Interceptor

    prepare

    如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

    Scope Interceptor

    scope

    将Action状态存入session和application的简单方法。

    Servlet Config Interceptor

    servletConfig

    提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

    Static Parameters Interceptor

    staticParams

    从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。

    Roles Interceptor

    roles

    确定用户是否具有JAAS指定的Role,否则不予执行。

    Timer Interceptor

    timer

    输出Action执行的时间

    Token Interceptor

    token

    通过Token来避免双击

    Token Session Interceptor

    tokenSession

    和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

    Validation Interceptor

    validation

    使用action-validation.xml文件中定义的内容校验提交的数据。

    Workflow Interceptor

    workflow

    调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

    Parameter Filter Interceptor

    N/A

    从参数列表中删除不必要的参数

    Profiling Interceptor

    profiling

    通过参数激活profile

    下面是一个简单的自定义filter也是上述struts.xml中 com.dabai.mall.filter.LoginInterceptor这个类

    public class LoginInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation arg0) throws Exception {

    User loginU=(User) ServletActionContext.getRequest().getSession().getAttribute("loginUser");
    if(loginU==null){
    return "login";
    }

    //拦截的业务功能记得在放行前进行!
    return arg0.invoke();
    }

    }

     

     

    下面再介绍一下Actio类

    在编写struts的Acton类时可以选择实现Action接口 也可以继承ActionSupport类事实上ActionSupport类已经实现了Action接口 而且便于使用 这里建议继承自ActionSupport类 然后再实现一个ModelDriven<T>接口,因为方便,modelDriven的源码:

    什么用途呢 就是getModel()用少写一个方法而已 但是却有一个好处  可以省得自己忘记写get方法。要知道前台传给后台数据转换时是通过属性驱动来进行的。下面是一个简单的Action

    public Class UserAction extends ActionSupport implements ModelDriven<User>{
        protected User user;
            @Override
    	public User getUserel() {
    		return this.user;
    	}
    public String login() {
    	    System.out.println("userAction:-----");
    	//此处作业务逻辑处理
    //这个LOGIN是Action接口中定义的静态常量等同于小写的字符串 便于实现struts.xml进行
    //结果映射处理  
    	       return LOGIN;
    	}
          
    }    
    

      在url中输入localhost:8080/UserAction_login  就能进入login方法中 如果成功可在控制台看到打印了:userAction:-----  若是配置了页面‘login.jsp'页面会进行跳转

     有关的jar包

    tomcat包已经在运行环境中  

     

  • 相关阅读:
    java制作的applet小型播放器
    java文件路径问题及Eclipse package,source folder,folder区别及相互转换
    转:文件操作之File类使用
    JFrame setDefaultLookAndFeelDecorated(true)
    java错误Cannot make a static reference to the nonstatic method
    转:HTML操作 Swing Components
    组件服务简介
    计算ttest 的C程序
    Excel统计函数中比较常用的函数
    Correlation with pvalues
  • 原文地址:https://www.cnblogs.com/notably/p/10502818.html
Copyright © 2011-2022 走看看