weixinAPI微信对接 Struts标签库 Xml的地址:http://blog.csdn.net/xiazdong/article/details/7293177 Struts注入优先考虑modelDirven中找,其次才是setter方法 Value注入值,ref注入对象 Jsp实时编译的,freemarker是预编译的 EL表达式只能取session、application、request的值 将String[]转换为List<String> Arrays.<String>alist(数组对象) Struts中上传文件大小不得大于2mb Struts中xml有继承的概念 拦截器方法在action执行前或之后执行,动态代理的原理,ref引用对象 Struts中没有404错误,一般为struts的异常模板,除非转发页面时没有找到页面 实现struts中action的方法: 1.继承actionsupport 2.实现action接口,重写String excute()方法 Struts2执行顺序: Struts-default---?struts-plugin--?struts.xml 使用Struts 2 开发程序的基本步骤 加载Struts2 类库 配置web.xml文件 开发视图层页面 开发控制层Action 配置struts.xml文件 部署、运行项目 struts2 动作配置 <package name=”唯一的包” namespace=”/” extends=”struts-default”> 定义动作 <action name=”虚拟地址” class=”交给哪个类来处理” method=”哪个方法”> <result name=”哪个方法返回的字符串” type=”转发dispatcher,重定向urlredirect,重定向action (redirectAction)” > 哪个页面显示 </result> </action> </package> 1、实现struts中的action有几种方法? 1)、 继承ActionSupport 2)、 实现Action 接口 -->重写 String execute() 2、动态调用 作用:减少action数量 使用:actionName!methodName.action 禁用:将属性struts.enable.DynamicMethodInvocation设置为false 如果使用动态调用就不能使用通配符 public class UserAction implements Action{//user!login.action,调用UserAction的login()方法 …… public String login(){…..} public String register(){…..} } <action name="user" class="com.xxxx.web.UserAction" > <result name="login">/page/manage.jsp</result> ………… </action> 3、设定默认action,用来显示用户输入错误action地址 配置默认Action 没有Action匹配请求时,默认Action将被执行 通过<default-action-ref…../>元素配置默认action <struts> <default-action-ref name=”defaultAction”/> <package name=”default” extends=”struts-default”> <action name=”defaultAction”> <result>error.jsp</result> </action> </package > <struts> 4、配置全局的结果集 全局结果 实现同一个包中多个action共享一个结果 <struts> <default-action-ref name=”defaultAction”/> <package name=”default” extends=”struts-default”> <global-results> <result name=” error”>/error.jsp</result> <result name=”login” type=”redirect”>/login.jsp</result> </global-results> …..省了action的配置 </package > <struts> 5、struts2原型图 用户请求-->ActionMapper(Action映射)-->FilterDispatcher(转发)-->ActionProxy(Action代理) -->读取配置文件-->比对struts.xml中配置 -->ActionInvocation(Action核心调度器) -->经过层层的(Interceptor)过滤-->执行Action中的method方法-->方法执行完后返回Result结果-->根据返回结果读取页面(Template)-->再一次经过层层(Interceptor)过滤-?响应给用户 6、拦截器和拦截器栈 拦截器,只能有一个功能 <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 拦截器栈, 是由一个或者多个拦截器组成的一个集合 <interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="deprecation"/> </interceptor-stack> 7、自定义拦截器 1)、继承 AbstractInterceptor 2)、重写 intercept 方法 Invocation.invoke(); 执行你定义的action中的方法 3)、在struts.xml中去配置 <!-- 配制全局的包,让其它packet继承这个包 --> <package name="commonPackage" namespace="/" extends="json-default" abstract="true"> <!-- 定义拦截器 --> <interceptors> <interceptor name="timeSpeend" class="com.wisezone.interceptor.TimeSpeedInterceptor"></interceptor> <!-- 定义拦截器栈,重写系统strtus-default.xml中默认的 --> <interceptor-stack name="myDefaultStack"> <!-- 系统默认的 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 我自己的 --> <interceptor-ref name="timeSpeend"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 更新全局的拦截器 --> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> </package> <!--约定大于配置 --> <packagename="FlinkTypePackage" namespace="/admin" extends="commonPackage"> </package> 8、文件上传命名规则 private File upload; private String uploadContentType; private String uploadFileName; 页面:<input type=”file” name=”upload”/> 9、自定义类型转换 public class DateConverter extends DefaultTypeConverter ArrayConverter ListConverter DateConverter NumberConverter StringConverter 10、strtus2值栈 要访问ValueStack就必须要与struts中的标签一起用,它不能单独使用 User (userName,password) -->存在值栈中 private User user; //getter/setter方法 <s:property value=”user.userName” /> <s:textfield name="user.userName" id="userName"></s:textfield> <s:password name="user.password" id="password"></s:password > 日期标签: 语法: <s:date format=”format” nice =”true|false” name=”name” id=”id”> ………. </s:date> Formate属性:指定格式进行日期格式化 Nice属性:该属性只有true和false两个值用于指定是否输出指定日期与当前时间的时差,默认为false Name属性:表示当前需要格式化的日期 Id属性:表示引用该元素的id值 11、struts2验证规则 void validate方法名() 对某一个动作进行验证 void validate() 所有的动作进行验证 ( 不会重写) public void saveInfo(){} public void validateSaveInfo(){ if(StringUtil.isEmpty(this.flinkType.getTypeName)){ super.addFiledError(“typeName”,”分类名称不能为空”); } } 12、国际化 13、保证新增和修改保存 唯一,不允许 重复提交 重复提交发生时机: 1)、网络慢的时候 2)、提交失败了报错, 按返回上一步,再一次提交 token 令牌机制 <package name="filePackage" namespace="/admin" extends="commonPackage"> <!-- 定义一个通配查询动作 admin/admin_angular1.action --> <action name="file_upload" class="fileUploadTestAction" method="upload"> <!-- 重复提交,开始token机制 --> <interceptor-ref name="myDefaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> <result name="success">/admin/flinktype/file.jsp</result> <result name="invalid.token">/admin/重复提交.jsp</result> </action> </package> 14、struts2类型转换器 struts2 TypeConvertor 博客园 15、freemarker 模板 框架 模板 页面:纯html ${name} 中间:Freemarker:velocity 后台:name=”张三” 16、Freemarker的使用方法 第一步:把freemarker的jar包添加到工程中 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。 第三步:创建一个Configration对象,该对象负责管理Freemarker的模板加载路径,负责生成模板实例 第四步:告诉config对象模板文件存放的路径。 第五步:设置config的默认字符集。一般是utf-8 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。数据模型就是一个MAP集合 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。 第十步:关闭writer对象。 17、 FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 18、freemarker通用插值: FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} 1、通用插值 对于FreeMarker的通用插值,又可以分为以下4种情况: 1. FreeMarker插值结果为字符串值:直接输出表达式结果 2. FreeMarker插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: <#settion number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent} ${answer} 输出结果是: $42.00 $42.00 42 $42.00 4,200% 3. FreeMarker插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ‘‘yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a ‘(‘zzz‘)‘")} 输出结果是: 2008-04-08 08:08:08 Pacific Daylight Time Tue, Apr 8, ‘03 Tuesday, April 08, 2003, 08:08:08 PM (PDT) 4. FreeMarker插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: <#assign foo=true/> ${foo?string("yes", "no")} 输出结果是: yes 2、数字格式化插值 关于FreeMarker数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: mX:小数部分最小X位 MX:小数部分最大X位 如下面的例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 输出2.58 --> #{y; M2} <#-- 输出4 --> #{x; m2} <#-- 输出2.6 --> #{y; m2} <#-- 输出4.0 --> #{x; m1M2} <#-- 输出2.58 --> #{x; m1M2} <#-- 输出4.0 --> 3、集合 集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子: <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x} </#list> 输出结果是: 星期一 星期二 星期三 星期四 星期五 星期六 星期天 4、If指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>... <#else> ... </#if> 例子如下: <#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>中年人 <#elseif (age>20)>青年人 <#else> 少年人 </#if> 输出结果是:青年人 4.2 switch , case , default , break指令 这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... </#switch> 5、字符串使用的内建函数: html : 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如 < 代替 < ) cap_first :字符串的第一个字母变为大写形式 lower_case :字符串的小写形式 upper_case :字符串的大写形式 trim :去掉字符串首尾的空格 6、Struts2解析FreeMarker模板中变量的顺序如下: 1,FreeMarker模板内建的变量; 2,ValueStack中的变量; 3,ActionContext中的变量; 4,HttpServletRequest中的属性; 5,HttpSession中的属性; 6,ServletContext范围的属性. type 所有类型:(在struts2-core.jar/struts-default.xml中) Type 类型值 作用说明 chain 用来处理Action 链 dispatcher(默认值) 用来转向页面,通常处理JSP redirect 重定向到一个URL redirectAction 重定向到一个 Action plainText 显示源文件内容,如文件源码 freemarker 处理 FreeMarker 模板 httpheader 控制特殊 http 行为的结果类型 stream 向浏览器发送 InputSream 对象, 通常用来处理文件下载,还可用于返回 AJAX 数据 velocity 处理 Velocity 模板 xslt 处理 XML/XLST 模板 Struts在值栈: <action name="paymentmanagement/*_*" class="{1}Action" method="{2}"> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="{2}" type="freemarker">/WEB-INF/admin/paymentmanagement/{1}_{2}.html</result> </action>
时间: 2024-10-09 20:08:29