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; } }
时间: 2024-10-13 22:28:07