- 浏览: 5183396 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
作者:隔壁老王(wallimn.iteye.com),本人原创,欢迎转载,转载请保留此信息。2010-06-25
刚开始用struts2.1.8、Hibernate3.5.3,不断地遇到问题、解决问题。学新东西还是让人痛并快乐着。
把一些东西记录下来,希望对其它朋友有所帮助。
(一)validateXxx返回不同的input页面
多数人会采用一个类多个方法的方式,如果多个方法都需要输入验证,验证失败时应该会返回各自不同的输入页面,而struts默认会返回统一的input页面。就显然不能满足应用的要求。
解决方法:
让Action实现ValidationWorkflowAware 接口,为getInputResultName()方法设置合适的返回值。
可以通过查看com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor的源码搞清楚其原理。
也有人说可以用注释的方法:
(二)使用beanutils.populate把request中的parameter转移到bean中时,日期格式字符串的处理
beanutils.populate方法,可以把提交的表单中的内容自动装配到bean实例中,非常的方便。
最新版本的beanutils包提供了功能更强的自动转换功能。一般情况下,对于含有日期类型的bean,通过日期选择控件,可以限制用户的输入要么满足yyyy-MM-dd的形式,要么为空。但是,当用户上传的日期字符串为空串的时候,会引发异常。
这可以通过自定义转换器的方式来解决。
注册方法:
这样就可以把日期字符串取到bean对象里了,空串也不会引发异常。
(三)xwork2.1.6的jar包、源码、文档下载地址:
http://release.opensymphony.com/xwork/2.1.6/xwork-assembly-2.1.6-all.zip
我估计:命名很规范,以后再出新版本,可以把上面的数字改一下。
(四)1Action多个方法(method)的相关问题
目前遇到这样几个问题:
每个方法各自进行输入校验,校验失败返回各自输入页面(如前所述,Action要实现接口:ValidationWorkflowAware);
token拦截器只拦截特定方法;
以上几个问题可以通过参数配置来解决,当然Action要提供相关参数的get、set方法。
(四)自定义一个既可以返回XML结果也可以返回json结果的struts结果类型
struts2自带了一个json结果类型,没有一个直接xml结果类型,自己写一个,试验了一下,效果还不错。xml类型的结果,我主要是在dhtmlXTree控件中使用。
类定义
配制文件
使用方法很简单
(五)获得request、response的方法
直接获取的方法:
或者使用IOC方法:
第一步:让action实现ServletRequestAware接口
第二步:在action中声明一个HttpServletRequest类型的实例变量
第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
对于response处理是类似的。
(六)上传文件过大的问题:
配置struts.multipart.maxSize项为你想要的大小.
默认2097152,即2M(2097152/1024/1024);
可修改struts.xml文件,加入常量
<constant name="struts.multipart.maxSize" value="10000000" />
刚开始用struts2.1.8、Hibernate3.5.3,不断地遇到问题、解决问题。学新东西还是让人痛并快乐着。
把一些东西记录下来,希望对其它朋友有所帮助。
(一)validateXxx返回不同的input页面
多数人会采用一个类多个方法的方式,如果多个方法都需要输入验证,验证失败时应该会返回各自不同的输入页面,而struts默认会返回统一的input页面。就显然不能满足应用的要求。
解决方法:
让Action实现ValidationWorkflowAware 接口,为getInputResultName()方法设置合适的返回值。
可以通过查看com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor的源码搞清楚其原理。
也有人说可以用注释的方法:
public class DownloadController extends ActionSupport { @InputConfig(methodName="inputIndex") //@InputConfig(resultName="input") public String index() { System.out.println("-------index-----------"); return "xx"; } public void validateIndex() { addFieldError("hell", ".my hello."); System.out.println("ok"); } public string inputIndex() { return "input"; } }
(二)使用beanutils.populate把request中的parameter转移到bean中时,日期格式字符串的处理
beanutils.populate方法,可以把提交的表单中的内容自动装配到bean实例中,非常的方便。
最新版本的beanutils包提供了功能更强的自动转换功能。一般情况下,对于含有日期类型的bean,通过日期选择控件,可以限制用户的输入要么满足yyyy-MM-dd的形式,要么为空。但是,当用户上传的日期字符串为空串的时候,会引发异常。
这可以通过自定义转换器的方式来解决。
/** * */ package com.wallimn.common.util; import java.util.Date; import org.apache.commons.beanutils.converters.DateTimeConverter; /** * <br/> * 编码:wallimn 时间:2010-6-24 下午05:36:24<br/> * 版本:V1.0<br/> */ public class MyDateConverter extends DateTimeConverter { /* (non-Javadoc) * @see org.apache.commons.beanutils.converters.AbstractConverter#getDefaultType() */ @SuppressWarnings("unchecked") @Override protected Class getDefaultType() { return Date.class; } @SuppressWarnings("unchecked") @Override protected Object convertToType(Class targetType, Object value) throws Exception { if(value==null || "".equals(value)){ return null; } return super.convertToType(targetType, value); } public MyDateConverter(){ super(); } public MyDateConverter(Object defaultValue){ super(defaultValue); } }
注册方法:
static { MyDateConverter d = new MyDateConverter (); String[] datePattern = { "yyyy-mm-dd", "yyyy/mm/dd", "yyyy.mm.dd" }; d.setPatterns(datePattern); ConvertUtils.register(d, java.util.Date.class); }
这样就可以把日期字符串取到bean对象里了,空串也不会引发异常。
public static void populate(HttpServletRequest request, Object obj) { Map map = request.getParameterMap(); try { BeanUtils.populate(obj, map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
(三)xwork2.1.6的jar包、源码、文档下载地址:
http://release.opensymphony.com/xwork/2.1.6/xwork-assembly-2.1.6-all.zip
我估计:命名很规范,以后再出新版本,可以把上面的数字改一下。
(四)1Action多个方法(method)的相关问题
目前遇到这样几个问题:
每个方法各自进行输入校验,校验失败返回各自输入页面(如前所述,Action要实现接口:ValidationWorkflowAware);
token拦截器只拦截特定方法;
以上几个问题可以通过参数配置来解决,当然Action要提供相关参数的get、set方法。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="com.wallimn.action.sys" namespace="/pages/sys" extends="wallimn"> <action name="User_*" method="{1}" class="com.wallimn.action.sys.UserAction"> <param name="methodName">{1}</param> <param name="inputResultName">{1}_input</param> <!-- 定义不同方法的输入、返回页面 --> <param name="methodSuccessResultName">{1}_success</param> <param name="methodErrorResultName">{1}_error</param> <param name="methodInputResultName">{1}_input</param> <interceptor-ref name="defaultStack"/> <interceptor-ref name="token"> <param name="sys_token"/> <!-- 逗号分隔,可以对指定的多个方法进行重复提交检验 --> <param name="includeMethods">register</param> </interceptor-ref> <result>/pages/sys/login.jsp</result> <result name="login_input">/pages/sys/login.jsp</result> <result name="login_success">/pages/sys/login_success.jsp</result> </action> <action name="Sys_*" class="com.wallimn.action.GeneralAction"> <result>/pages/sys/{1}.jsp</result> </action> </package> </struts>
(四)自定义一个既可以返回XML结果也可以返回json结果的struts结果类型
struts2自带了一个json结果类型,没有一个直接xml结果类型,自己写一个,试验了一下,效果还不错。xml类型的结果,我主要是在dhtmlXTree控件中使用。
类定义
package com.wallimn.common.util; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.util.ValueStack; /** * 可以是XML,或者json文本<br/> * 编码:wallimn 时间:2010-6-29 下午05:11:25<br/> * 版本:V1.0<br/> */ public class AjaxResult extends StrutsResultSupport { /** * 说明:<br/> * 时间:2010 下午05:11:48 */ private static final long serialVersionUID = -1253157812823444791L; public AjaxResult(){ super(); } public AjaxResult(String location){ super(location); } private String contentType="text/xml;charset=UTF-8"; private String xmlHead=null; private String charset="UTF-8"; private String nocache="true"; /** * 标识内容的key */ public final String KEY_CONTENT="ajax.resultstring.by.wallimn"; /** * 控制是否添加xml文件的头 */ public final String KEY_ADDXMLHEAD="ajax.addxmlhead.by.wallimn"; /* (non-Javadoc) * @see org.apache.struts2.dispatcher.StrutsResultSupport#doExecute(java.lang.String, com.opensymphony.xwork2.ActionInvocation) */ @Override protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE); PrintWriter pw = response.getWriter(); resolveParamsFromStack(invocation.getStack()); response.setContentType(contentType); response.setCharacterEncoding(charset); if(!"false".equals(nocache)){ response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setHeader("expires", "0"); } if(xmlHead!=null && !"".equals(xmlHead)){ Boolean bAddHead = (Boolean) invocation.getInvocationContext().get(KEY_ADDXMLHEAD); if(bAddHead!=Boolean.FALSE){ pw.println(xmlHead); } } String resultString = (String) invocation.getInvocationContext().get(KEY_CONTENT); pw.println(resultString); response.getWriter().flush(); } protected void resolveParamsFromStack(ValueStack stack){ String contentType = stack.findString("contentType"); if(contentType!=null){ this.setContentType(contentType); } String charset = stack.findString("charset"); if(charset!=null){ this.setCharset(charset); } String xmlHead = stack.findString("xmlHead"); if(xmlHead!=null){ this.setXmlHead(xmlHead); } String nocache = stack.findString("nocache"); if(xmlHead!=null){ this.setNocache(nocache); } } public void setContentType(String contentType) { this.contentType = contentType; } public String getContentType() { return contentType; } public void setCharset(String charset) { this.charset = charset; } public String getCharset() { return charset; } public void setXmlHead(String xmlHead) { this.xmlHead = xmlHead; } public String getXmlHead() { return xmlHead; } public void setNocache(String nocache) { this.nocache = nocache; } public String getNocache() { return nocache; } }
配制文件
<package name="wpsystem" namespace="/" extends="struts-default"> <result-types> <result-type name="ajaxResult" class="com.wallimn.common.util.AjaxResult"></result-type> </result-types> <global-results> <result name="ajax.xml" type="ajaxResult"> <param name="contentType">text/xml;charset=UTF-8</param> <param name="xmlHead"><?xml version="1.0" encoding="UTF-8" ?></param> </result> <result name="ajax.json" type="ajaxResult"> <param name="contentType">text/plain;charset=UTF-8</param> </result> </global-results> </package>
使用方法很简单
public String unittreexml() throws Exception{ String xml = "XML字符串"; ActionContext.getContext().put(KEY_CONTENT,xml); return "ajax.xml"; } public String json() throws Exception{ ActionContext.getContext().put(KEY_CONTENT,"{email:'wallimn@sohu.com',name:'wallimn'}"); return "ajax.json"; }
(五)获得request、response的方法
直接获取的方法:
HttpServletRequest request = ServletActionContext.getRequest (); //或者: ActionContext ct= ActionContext.getContext() ; HttpServletRequest request= (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);
或者使用IOC方法:
第一步:让action实现ServletRequestAware接口
第二步:在action中声明一个HttpServletRequest类型的实例变量
第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
对于response处理是类似的。
(六)上传文件过大的问题:
配置struts.multipart.maxSize项为你想要的大小.
默认2097152,即2M(2097152/1024/1024);
可修改struts.xml文件,加入常量
<constant name="struts.multipart.maxSize" value="10000000" />
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18681编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2504部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3499两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 18481.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7701一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1287我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3276做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1190写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 4010大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2415一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7568我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2793@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2101转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3093用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1779element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9808示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6679申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5357最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5303springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10453微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
3.4 实现spring、struts2.x和hibernate框架集成 3.5 小结 第2篇 典型模块开发 第4章 在线文本编辑器(fckeditor) 4.1 分析fckeditor在线文本编辑器 4.2 fckeditor在线文本编辑器初级应用 4.3 ...
2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 ...
作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...
适用于对Struts2与ExtJS有一定了解的开发者,特别是对于那些希望通过实战案例加深理解的初学者而言非常有用。 **技术栈**: - **开发环境**:Eclipse 3.5 - **数据库**:Oracle 10g - **后端框架**:Struts2 - **...
第14章spring与struts2、hibernate框架的整合基础 277 14.1spring与struts2的整合方式 277 14.1.1struts2应用的扩展方式 277 14.1.2spring插件的应用 278 14.2spring和hibernate的整合 279 14.2.1spring对...
本书从J2EE基础入手,逐步深入到Struts和Hibernate的运用,最后通过实战案例的方式展示了如何构建一个完整的电子商务系统。通过对本书的学习,读者不仅能够掌握J2EE、Struts和Hibernate的核心概念和技术,还能学会...
第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用...
14.3 调整Struts:使用BeanAction 245 14.3.1 BaseBean 246 14.3.2 BeanAction 246 14.3.3 ActionContext 246 14.4 JGameStore工程结构 247 14.4.1 src文件夹 247 14.4.2 test文件夹 248 14.4.3 web文件夹 248 ...
##### 2.1 Web基础 - **HTML、CSS、JavaScript**:熟悉网页的基本组成元素,掌握HTML标记语言、CSS样式表和JavaScript脚本语言的基本用法。 - **HTTP协议和Web服务器**:理解HTTP协议的工作机制,了解常用的Web...