struts注重点
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>5.给action中的参数赋值<action ----> <param name="param_name">xxx</param> <result>index.jsp</result></action>6.常量标签<指定截取的后缀<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"/>struts2加载常量的搜索顺序struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml如果在多个配置中定义了同一常量则后一文件中的常量将覆盖前面的常量主题<constant name="struts.ui.theme" value="simple"/>7.指定调用方法 默认是执行execute动态方法调用:<constant name="struts.enable.DynamicMethodInvocation" value="true"/>在访问路径后加!methodname 如/example/list!add.action也可以用通配符来确认<action name="list_*_*" 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.propertiesjava.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.art和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="自定义拦截器名" 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.xml15.国际化全局范围、包范围、action范围命名格式:baseName_language_country.propertiesbaseName_language.propertiesbaseName.propertiesbaseName是资源文件基本名可以自定义,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>///发现表单重估提交时返回视图