zoukankan      html  css  js  c++  java
  • Action开发、通配符、路径问题和struts中常量用法

    1、action开发

    开发的几种方式

     (1)、继承自ActionSupport,(如果用struts的数据效验功,能必须必须使用此功能,因为ActionSupport实现了数据效验的接口)

    public class UserAction extends ActionSupport{}
    

     (2)、实现Action接口,该接口的内容如下。(有五个常量和一个方法)

    pubic interface Action{
       public static final String success="success";
       public static final String NONE="none";
       public static final String INPUT="input";
       public static final String LOGIN="login";
       public Strng execute() throws Exception;       
    }
    

     (3)、不实现任何类,也不继承任何接口。

    public class UserAction3{
    	//action 中业务处理方法
    	public String login(){
    		System.out.println("UserAction Log(3)!");
    		return "success";
    	}
    	
    }
    

     2、访问通配符

    在struts的配置信息中可以用*代表与{1}来优化

    刚开始的时候是这样写的

    <struts>
        <package name="config" namespace="/" extends="struts-default">
        	<action name="login" class="com.gqx.a_test.UserAction" method="login">
        		<result name="success">/index.jsp</result>
        	</action>
        	<action name="register" class="com.gqx.a_test.UserAction" method="register">
        		<result name="success">/index.jsp</result>
        	</action>  	
        </package>  
    </struts>
    

    现在可以使用通配符去优化

    <!-- 使用通配符去优化 -->
        	<action name="user_*" class="com.gqx.a_test.UserAction" method="{1}">
        		<result name="success">/index.jsp</result>
        	</action>
    

     结果如下图


    现在当在action中返回字符串的结果不相同的时候,可以这样写

    public class UserAction extends ActionSupport  {
    	//action 中业务处理方法
    	public String login(){
    		System.out.println("UserAction Log()!");
    		return "login";
    	}
    	public String register(){
    		System.out.println("UserAction Register()!");
    		return "register";
    	}
    }
    

    同时返回的jsp页面不同,这个时候可以这样去配置struct.xml

        <action name="user_*" class="com.gqx.a_test.UserAction" method="{1}">
        		<result name="{1}">/{1}.jsp</result>
        	</action>
    

     结果如图:

    3、struts中路径匹配原则

     一般的默认namespace="/",当你改成

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

     就需要访问这个路径http://localhost:8080/Struts_Study/user/user_register

     

    这时候你还可以这样访问http://localhost:8080/Struts_Study/user/a/b/user_register,结果是正常的

    但是这样就不行了 http://localhost:8080/Struts_Study/a/b/user/user_register

    究其原因是因为当用户在地址栏输入http://localhost:8080/Struts_Study/user/a/b/user_register,回车后

    在服务器Tomcat端

      localhost             找到访问那一台机器

      8080              根据端口号,找到tomcat

      Struts_Study          找到项目名称

      /user/a/b          寻找是否有这个名称空间,没找到,继续向下(找到就返回)

      /user/a           寻找是否有这个名称空间,没找到,继续向下(找到就返回)

      /user            寻找是否有这个名称空间,没找到,继续向下(找到就返回)

      /               默认命名空间,还没有找到,报错

      


    1、常量

    struts中默认访问后缀

      在struts1中是do,在struts2中是action(以下都可以)

     那么如何修改默认访问的后缀

    struts2的默认后缀在struts-core-2.3.4-1/org.apache.struts/default.properties中有如下代码

    struts.action.extension=action,,
    

     在struts中通过常量去修改

    <!-- 全局配置 -->
    	<!-- 修改struts默认的访问后缀 -->
    	<constant name="struts.action.extension" value="action,do,,"></constant>
    

     指定访问后缀为do,action或没有都可以

    当 value="action,do"     访问后缀只能是action或do

    当 value="action"  访问后缀只能是action

     Struts2中常用的常量

      指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
        <constant name="struts.i18n.encoding" value="UTF-8"/>
        自定义后缀修改常量
        <constant name="struts.action.extension" value="action,,"/>
        设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 
        <constant name="struts.serve.static.browserCache" value="false"/>
        当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 
        <constant name="struts.configuration.xml.reload" value="true"/>
        开发模式下使用,这样可以打印出更详细的错误信息 
        <constant name="struts.devMode" value="true" />
        默认的视图主题 
        <constant name="struts.ui.theme" value="simple" />
        与spring集成时,指定由spring负责action对象的创建 
        <constant name="struts.objectFactory" value="spring" />
        该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性
        为 false
        <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
        上传文件的大小限制
        <constant name="struts.multipart.maxSize" value=“10701096"/>

    动态方法调用示例,首先在配置文件加上

    <!-- 动态方法调用 -->
    	 <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    

     在action中写入

    <!-- 动态方法调用上-->
        	<action name="user" class="com.gqx.b_test.UserAction">
        		<result name="success">/index.jsp</result>
        	</action>
    

     在浏览器端地址栏可以输入:http://win-29gp9rls36l:8080/Struts_Study/user!login(感叹号后放方法,一般不会这样写,因为这样写要对类特别的了解,同时缺少安全性)

    2、全局跳转视图配置、配置的各项默认值

    (1)在struts.xml中配置全局视图(注意:global-results必须放在action的前面。)

    <!-- 配置全局跳转视图-->
        	<global-results>
        		<result name="success">/index.jsp</result>
        	</global-results>
        	<action name="user_*" class="com.gqx.b_test.UserAction" method="{1}">
        		<!-- 返回结果标志success对应的页面在当前页action中没有配置,
        		所以会去找全局配置中是否有success标记的页面 -->
        	</action>
    

     (2)配置各项默认值

    <!-- 配置各项默认值 -->
        	<!-- 
        		只配置访问路径名称
        		class 默认执行的action在struts-default.xml中有配置
        		<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />	
        		该ActionSupport中有方法execute()为默认的方法,同时会返回success,然后会去全局找success
        	 -->
        	<action name="test">
        		
        	</action>
    

     (3)WEB-INFO下的资源只能通过转发去访问,不能通过重定向去访问。


    js:选项卡的制作

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>选项卡</title>
        <style type="text/css" media="screen">
        #div1 div {
             200px;
            height: 200px;
            border: 1px #000 solid;
            display: none
        }
        
        #div1 input.active {
            background: red;
        }
        </style>
    </head>
    <div id="div1">
        <input class="active" type="button" value="1">
        <input type="button" value="2">
        <input type="button" value="3">
        <div style="display:block">1111选项卡</div>
        <div>2222选项卡</div>
        <div>3333选项卡</div>
    </div>
    <script type="text/javascript">
    	var oDiv=document.getElementById('div1');
    	var oBtn=oDiv.getElementsByTagName('input');
    	var aDiv=oDiv.getElementsByTagName('div');
    	// 当需要外层的循环的i值去作为内层循环的一个参照的时候需要这只索引
    	for (var i = oBtn.length - 1; i >= 0; i--) {
    		oBtn[i].index=i;
    		oBtn[i].onclick=function () {	
    			for (var i = oBtn.length - 1; i >= 0; i--) {
    				oBtn[i].className='';
    				aDiv[i].style.display='none';
    			}
    			this.className='active';
    			aDiv[this.index].style.display='block';
    		}
    	}
    </script>
    
    <body>
    </body>
    
    </html>
    
  • 相关阅读:
    Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)
    [ZJOI2008]杀蚂蚁antbuster 题解
    赛前集训的第一个小总结(希望?)
    Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
    Luogu2150 寿司晚宴
    「考试总结2020-08-03」可期
    Luogu4747 [CERC2017]Intrinsic Interval
    BZOJ2839 集合计数
    Luogu5369 [PKUSC2018]最大前缀和
    Luogu5772 [JSOI2016]位运算
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6158515.html
Copyright © 2011-2022 走看看