Struts2基础学习总结(二)

Struts2基础学习总结(二)---struts.xml参数


 

1.常量

使用<constant name="" value=""></constant>元素进行描述

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

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

</struts>

常用的常量

常量名

常量值

说明

struts.i18n.encoding

UTF-8

应用中使用的编码

struts.objectFactory.spring.autoWire

name

和spring框架整合有关

struts.multipart.parser

jakarta

指定文件上传用的组件

struts.multipart.maxSize

2097152

文件上传总文件大小限制:2M

struts.action.extension

action,do,

能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔

struts.enable.DynamicMethodInvocation

false

是否允许动态方法调用

struts.devMode

false

是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。

struts.ui.theme

xhtml

页面展示用的主题

2.package元素

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

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
     <!--  name:包的名称。必须写。且必须唯   -->
     <!--  namespace:名称空间    如:  namespace="/struts" 访问时必须加上  -->
     <!--  extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能   -->
     <!-- abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包  -->
    </package>

</struts>

3.action元素

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

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">

        <action name="login" class="com.hdj.controller.userLogin" method="userLogin" >
         <!--  name:动作名称 对应jsp中     form表单的action   -->
         <!-- class:动作类全名     class省略时继承ActionSupport-->
         <!-- method:动作类中的方法名称   method省略时默认是public String execute(){}-->   
         <result  name="MySuc" >/mysuc.jsp </result>
         <!-- result中name返回的是 controller层方法的返回值-->
         <!-- type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher请求转发   type类型还有redirect chain-->
        </action>
     
     </package>
</struts>

action中的通配符*

      <action name="*" class="com.hdj.controller.userLogin" method="{1}" >
         <result  name="MySuc" >/{1}.jsp </result>
        </action>

升级版:

 <action name="*_*" class="com.hdj.controller.{1}" method="{2}" >
         <result  name="MySuc" >/{2}.jsp </result>
        </action>

动态方法调用:在Struts.xml的action中没有申明method的方法直接通过jsp页面的href动态调用动作类中的方法

  • 申明

struts.enable.DynamicMethodInvocation

false

是否允许动态方法调用

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

  • action中不配method
<action name="login" class="com.hdj.controller.userLogin"  >
         <result  name="MySuc" >/mysuc.jsp </result>
        </action>
  • 动作名称!动作方法名称(jsp页面)
 <a href="login!userLogin" >动态方法登入</a>

4.全局视图

当多个action中都使用到了相同result,这时我们应该把result定义为全局结果。(注:局部的会覆盖全局)

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

5.拦截器

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

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    
    <package name="user" namespace="/" extends="struts-default">
        <interceptors>
            <!-- 拦截器声明  -->
            <interceptor name="authorInterceptor" class="com.hzp.interceptor.AuthorInter"></interceptor>
            <interceptor name="timeInterceptor" class="com.hzp.interceptor.TimeInterceptor"></interceptor>
            <!-- 拦截器栈 -->
            <interceptor-stack name="auth">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="authorInterceptor"></interceptor-ref>
                <interceptor-ref name="timeInterceptor"></interceptor-ref>
            </interceptor-stack>
            
            <interceptor-stack name="loginInter">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="timeInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        
        <action name="userLogin" class="com.hzp.controller.LoginCtrl" >
       <!-- 拦截器在action中使用  -->
            <interceptor-ref name="loginInter"></interceptor-ref>
            <result type="redirect">/welcome.jsp</result>
            <result name="login">/login.jsp</result>
        </action>
 </package>

</struts>

拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。拦截器就是指实现了Interceptor接口的类,(或者继承AbstractInterceptor)

package com.hzp.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class AuthorInter  implements Interceptor{

    public void destroy() {
        
    }

    public void init() {
        
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext ac = invocation.getInvocationContext();
        Map<String,Object> session = ac.getSession();
        String uName =(String) session.get("uName");
        if(uName != null){
            return invocation.invoke();
        }
        return "login";
    }

}
package com.hzp.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class TimeInterceptor extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        
        long startTime = System.currentTimeMillis();
       
        String result = invocation.invoke();
       
        long executionTime = System.currentTimeMillis() - startTime;
        System.out.println(executionTime);
        return result;    
    }

}
原文地址:https://www.cnblogs.com/hudj/p/6855391.html