博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts注重点
阅读量:6969 次
发布时间:2019-06-27

本文共 10614 字,大约阅读时间需要 35 分钟。

hot3.png

1.自从Struts2.13以后,之前的FilterDispatcher标注为过时  

<filter-class>  
    org.apache.struts.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
</filter-class>  
  
2.action中默认的method为execute()  
    默认class为ActionSupport  
   默认name为success;  
  
3.转发类型   传中文参数URLEncoder.encode("","UTF-8");  
forward   
  
redirect(浏览器跳转)
<result type="redirect">/index.jsp</param>  
  
redirectAction(跳转到另一action)   
<result type="redirectAction">  
    <param name="actionName">xxx</param>  
    <param name="namespace">/xxx/xxx</param>  
</result>  
  
plainText(返回jsp页面的源代码)  中文问题  
<result type="plainText">  
    <param name="location">index.jsp</param>  
    <param name="charSet">UTF-8</param>  
</result>  
  
4.共用  
<global-results>  
   <result name="success">index.jsp</result>  
</global-results>
定义在<package>中,需要满足如下顺序:(result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-exception-mappings?, action*)。   
执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>
 5.给action中的参数赋值   
<action>  
    <param name="param_name">xxx</param>  
    <result>index.jsp</result>  
</action>  
  
6.常量标签  
指定截取的后缀  默认值为action
<constant name="struts.action.extension" value="do,action"/>  
  
指定默认编码集 作用于HttpServletRequest的setCharacterEncoding的方法  
<constant name="struts.i18n.encoding" value="UTF-8"/>  
 
设置浏览器是否缓存静态页面 默认值为true  
<constant name="struts.serve.static.browserCache" value="true"/>  
 
当struts的配置文件被修改后,系统是否自动重新加载文件 默认值为false  
<constant name="struts.configuration.xml.reload" value="true"/>  
  
打印详细错误信息  开发阶段可以打开  
<constant name="struts.devMode" value="true"/>  
 
与spring集成时,指定由spring负责的action对象创建  
<constant name="struts.objectFactory" value="spring"/>  
 
上传文件大小限制  默认大小为10701096  
<constant name="struts.multipartmaxSize" value="10701096"/> 
主题  
<constant name="struts.ui.theme" value="simple"/>  

允许访问静态方法

<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
动态方法调用
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.locale" value="zh_CN" />
struts2加载常量的搜索顺序  
struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml  
如果在多个配置中定义了同一常量则后一文件中的常量将覆盖前面的常量  
    
7.指定调用方法  默认是执行execute  
动态方法调用:  
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>  
在访问路径后加!methodname   如/example/list!add.action  
 
也可以用通配符来确认  
<action name="list_*_*" class="com.ss.action.{1}Action" method="{1}">  
    <result name="success">/{2}.jsp</result>  
</action>  
  
8. 2.1.6版本 接受中文请求参数出现乱版  
新建一个过滤器filter放到struts2的filter之前,然后在doFilter()方法中添加代码  
public void doFilter(){  
    HttpServletRequest req=(HttpServletRequest)request;  
    req.setCharacterEncoding("UTF-8");  
    filterchain.doFilter(request,response);  
}  
  
9.定义类型转换器  
一、局部  
定义一个类并继承DefaultTypeConverter从写  
convertValue(Map<String,Object> context,Object value,Class toType){  
  SimpleDateFormat date=new SimpleDateFormat("yyyymmdd");  
    try{  
       if(toType==Date.class){  
           String[] params=(String[])value;  
           return dateFormat.parse(params[0]);  
       }else if(toType==String.class){  
           Date date=(Date)value;  
           return dateFormat.format(date);  
       }  
     }catch(ParseException e){  
        return null;  
     }  
}  
注册:在Action类包下放置<ActionClassName>-conversion.properties文件  
   属性名=包名.定义的类  
二、全局  
在src下(WEB-INF/class/)下   xwork-conversion.properties  
java.util.Date=包名.类名  
  
10.向request、session、application中添加属性  
ActionContext act = ActionContext.getContext();  
act.getApplication.put("app","应用范围");  
act.getSession.put("ses","session应用范围");  
act.put("req","request范围")  
  
获取原生的请求对象  
HttpServletRequest request = ServletActionContext.getRequest();  
ServletContext servlet = ServletActionContext.getServletContext();  
servletContext.getRealPath(“”);得到具体文件的绝对路径  
request.getSession().setArrtibute("session","会话范围");  
servletContext.setAttribut("app","应用范围");  
request.setAttribute("req","request范围");  
页面访问  
${applicationScope.app}  
${sessionScope.ses}  
${requestScope.req}  
  
11.struts2上传文件  
第一步:放jar包 commond-fileupload-1.21.jar和commons-io-1.3.2.jar  
第二步:把form表单的enctype设置为:multipart/form-data  如  
<form enctype="multipart/form-data"   
    action="${pageContext.request.contextPath/list.action}" method="">  
  <input type="file" name="uploadImage">  
  <input type="submit" value="upload"/>  
</form>  
第三步:在action中添加以下属性  命名规则  与file的name相同  
private File uploadImage;//得到上传文件  
private String uploadImageContentType;//得到上传文件的类型  
private String uploadImageFileName;//得到上传文件的名称  
  
String realPath=ServletActionContext.getServletContext().getRealPath("/images");  
File saveFile=new File(new File(realPath),uploadImageFileName);  
if(!savefile.getParentFile().exists())   
  saveFile.getParentFile().mkdirs();  
FileUtils.copyFile(uploadImage,saveFile);  
  
12.多文件上传  
将属性类型定义成数组或list类型  
private File[] uploadImage;  
private String[] uploadImageContentType;  
private String[] uploadImageFileName;  
 
String realPath=ServletActionContext.getServletContext().getRealPath("/images");  
if(uploadImage!=null){  
    File savedir=new File(new File(realPath));  
    if(!savedir.exists())   
          savedir.mkdirs();  
    for(int index=0;index<uploadImage.length,index++){  
        File saveFile=new File(savedir,uploadImageFileName[index]);  
        if(!saveFile.getParentFile().exists())   
           saveFile.getParentFile().mkdirs();  
        FileUtils.copyFile(uploadImage[index],saveFile);  
    }  
}  
13.自定义拦截器  
一:类实现Interceptor接口   
在intercept方法中进行操作,invocation.invoke();继续执行该方法  
二:注册拦截器  
在sturts配置中定义:  
<interceptors>  
   <interceptor name="自定义拦截器名" class="类"/>  
   <interceptor-stack name="栈名">  
      <interceptor-ref name="defaultStack"/>引用原来的拦截器  
      <interceptor-ref name="自定义拦截器名"/>  
   </interceptor-stack>  
</interceptors>  
<action name="xxx" class="xxxx">  
   <interceptor-ref name="栈名">  
</action>  
  
定义一个包下的所有action都使用此拦截器  
<default-interceptor-ref name="栈名"/>  
  
14.struts2的校验  
第一:手工代码校验  
一:所有方法校验  
    1、类继承ActionSupport 再重写validate方法  
    2、在validate中写入自己的验证需要  
    3、此方法this.addFieldError("username","用户名不能为空!");用于放置错误信息  
正则表达式的验证:  
Pattern.compile(regex).matcher(this.mobile).matches();regex以^开始以$结尾    
  
fieldError包含错误信息则返回input   <s:fielderror/>显示错误信息  
二:指定方法校验  
   1、继承ActionSupport,再写方法validateXxx() 其他同上一样  
  
第二:xml配置进行校验  
一、所有方法  
1.继承ActionSupport类,校验文件与action同包  命名ActionClassName-validation.xml    
文件内容:   
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"   
  
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
<validators>  
 <field name="username">  
   <field-validator type="requiredstring">  
       <param name="trim">true</param>  
       <message>用户名不能为空!</message>  
   </field-validator>  
   <field-validator type="tringlength">  
       <param name="minLength">4</param>  
       <param name="minLength">10</param>  
       <message><![CDATA[用户名应在4到10之间]]</message>  
   </field-validator>  
  </field>  
  <field name="mobile">  
     <field-validator type="requiredstring">  
         <message>手机号不能为空!</message>  
    </field-validator>  
    <field-validator type="regex">  
        <param name="expression"><![CDATA[^1[358]\d{9}$]]/>  
        <message>手机号格式不正确</message>  
    </field-validator>  
  </field>  
  <field name="age">  
      <field-validator type="int">  
          <param name="min">1</param>  
          <param name="max">150</param>  
          <message>年龄范围不对!</message>  
      </field-validator>  
  </field>  
</validators>  
  
校验器的路径:com.opensymphony.xwork2.validators下的default.xml中  
二、指定方法  
文件命名:类名-配置中actiono的name-validation.xml  
  
15.国际化  
全局范围、包范围、action范围  
命名格式:  
baseName_language_country.properties  
baseName_language.properties  
baseName.properties  
baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家  
中国baseName_zh_CN.properties  
台湾baseName_zh_TW.properties  
美国baseName_en_US.properties  
  
在properties中MyEclipse支持自动将中文转换为Unicode编码  
利用jdk提供的native2ascii命令格式转:  
native2ascii 源文件.properties 目标文件.properties  
  
通过在浏览器中改变语言就可以再语言间转换  
一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本  
*在jsp页面是用<s:text name=""/>标签来输出国际化信息  name为资源文件中的key  
*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参  
  
数为资源文件中key  
*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/>  
  
有占位符的表示:  
welcome={0},欢迎光临!{1}  
*在jsp页面:  
<s:text name="welcome">  
    <param><s:property value="realname"/></s:param>  
    <param>学习</param>  
</s:text>  
*在action类中:  
getTest(String key,String[] args)或者是getText(String aTextName,List args)方法  
  
二、包范围  
在包下放置package_language_country.properties资源文件  package为固定写法  
该包及子包下的action毒可以访问该资源  系统会先找包资源文件  找不到则找系统资源  
  
中的key  
  
三:action范围  
在action所在路径放置ActionClassName_language_country.properties的资源文件  
  
无需任何配置直接从资源文件中获取配置:利用标签  
<s:i18n name="资源文件名"> 全局  
   <s:text name="welcome">  
    <param>小张</param>  
   </s:text>  
</s:i18n>  
<s:i18n name="路径.package">从包中  
   <s:text name="welcome">  
    <param>小张</param>  
   </s:text>  
</s:i18n>  
<s:i18n name="路径.ActionName">action  
   <s:text name="welcome">  
    <param>小张</param>  
   </s:text>  
</s:i18n>  
  
16.OGNL表达式语言  
类静态方法调用格式:  
@类名(包括路径)@方法名  
  
OGNL Context(ActionContext)访问上下文中的对象:session、request、application、  
  
attr、parameters、OgnlValueStack  
访问对象格式:#session、#request  
访问对象属性格式:#session.userName或者#session['userName']  
其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找  
需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性  
 
17.常用标签使用  
*构造list对象:  
<s:set var="list" value="{'1','2','3'}"/>  
 
*迭代list:此标签迭代时将当前对象放到栈顶  
<s:iterator value="#list">  
    <s:property/>  
</s:iterator>  
 
*构造map对象:  
<s:set var="maps" value="#{'key1':90,'key2':20}"/>  
*迭代map:  
<s:iterator value="#maps" status="obj">  
    <s:property value="key"/>=<s:property value="value"/>  
</s:iterator>  
obj包含方法:  
int getCount();返回当前迭代了几个元素  
int getIndex();返回当前迭代元素的索引  
boolean isEven();返回当前使用元素索引是否为偶数  
boolean isOdd();返回当前元素的索引是否为奇数  
boolean isFirst();  
boolean isLast();  
  
*判断元素是否在集合中:  
<s:if test="foo" in/not in {"foo","tar"}>  
在  
</s:if>  
<s:else>  
不在  
</s:else>  
  
*投影  在大集合中过滤数据放到小集合  例:Book对象  
?表示获取符合逻辑的元素  
^获取符合逻辑的第一个元素  
$获取符合逻辑的最后一个元素  
{}表示从大集合中筛选到小集合  
<s:iterator value="books.{?#this.price>35}">  
   <s:property value="title"/>==<s:property value="price"/>  
</s:iterator>  
 
*URL标签  
<s:url action="" namespace="">  
   <param name="" value=""/>  
</s:url>  
 
<s:set name="myurl" value="www.baidu.com"/>  
<s:url id="url" action="hello">  
      <s:param name="request_locale">en</s:param>  
</s:url><s:a href="%{url}">English</s:a>  
如果href="#myurl"  他会把他当做字符处理  要这样:  
<s:a href="%{#myurl}"/>  
  
*复选框   集合list和集合map  
集合list  
<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>  
value属性用于指定被选择的复选框  
  
集合map  
<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"   
  
listValue="value" value="{1,2,3}"/>  
  
*单选框  
集合JavaBean  
<s:radio name="beans" list="#request.persons" listKey="personid"   
  
listValue="name"/>  
集合list  
<s:radio name="list" list="{'java','c#'}" value="java"/>  
集合map  
<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   
 
value="1"/>  
  
*下拉列表框  
<s:select name="list" list="{'java','c#'}" value="java"/>  
<s:select name="beans" list="#request.persons" listKey="personid"   
 
listValue="name"/>  
<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   
  
value="1"/>  
 
18:防止表单重复提交  
<s:form actio="" namespace="" method="post"?  
    <s:textfield name="name"/>  
    <s:soken/>
    <input type="submit" value="提交"/>  
</s:form>  
引入拦截器  
<interceptor-ref name="defaultStack"/>  
<interceptor-ref name="token"/>
<result name="invalid.token">index.jsp</result>///发现表单重估提交时返回视图  
原文网址:

转载于:https://my.oschina.net/zhengjian/blog/119051

你可能感兴趣的文章
php怎么连kafka,php连接kafka
查看>>
php动态生成html,通用PHP动态生成静态HTML网页的代码
查看>>
dede个人中心php在哪,dedecms织梦如何自定义会员中心目录名称的方法
查看>>
linux 运维高级脚本生成器,Linux运维实例 高效运维的工具--shell脚本
查看>>
linux配置redis服务,Linux下安装Redis并设置相关服务
查看>>
poj1106
查看>>
个人知识管理工具 PinPKM
查看>>
Jobs in Codility they're hiring
查看>>
linux下VNC的配置及使用
查看>>
为什么.NET Framework就没有个专门的P/Invoke Library?
查看>>
Silverlight动态设置WCF服务Endpoint
查看>>
lucene对日期(date)和整形(int)处理
查看>>
hdu 4081 次小生成树
查看>>
HtmlNodeType枚举
查看>>
基于TCP的多进程echo服务器
查看>>
ASP.NET页面在IE缓存问题的解决
查看>>
最简单的Epoll模型代码
查看>>
数据结构之字符串
查看>>
blob字段存储文件并读取
查看>>
Process
查看>>