- 浏览: 134713 次
- 性别:
- 来自: 武汉
最新评论
-
ping2010:
“备注:半推的第一个例子中,服务器是推向指定的ScriptSe ...
dwr3 Reverse Ajax学习小结 -
r4196503:
14行 copy(imgFile, newPath); 第一 ...
kindeditor上传图片的修改 -
muqingren:
你这个绑定多个表单对象能实现吗?
Spring MVC - Binding to multiple commands -
skying8603:
Util util = new Util(session); ...
dwr3 Reverse Ajax学习小结 -
soliucheng:
在修改数据的时候不需要吧,他会自己把版本号跟上。Hiberna ...
ss3ex中Hibernate的乐观锁使用
自定义URL格式,本方法只是在模仿REST样的URL格式:
比如原先的某一URL为:http://localhost:8080/article/article!listItems.shtml?article.id=297ef77923fe21850123fe24f405000f,
现在改为了:http://localhost:8080/article/article/listItems/297ef77923fe21850123fe24f405000f.shtml。去掉了“!”和“?”,而且他比REST格式的URL还要实在些。
后缀“.shtml”根据需要可以去掉。与REST式URL的不同在于,优点:
缺点:没有实现REST式XML等的功能,不过也可以实现。
实现思路及代码(照抄ss3ex中的代码):
1、写个自定义RestfulActionMapper 类,实现ActionMapper接口,其实也可以直接继承DefaultActionMapper,但是写的代码要多些。
}
2、修改struts.properties文件中的默认配置
3、在action中得到ActionMapping中的参数的方法,有2种办法,一是在action中写个方法,利用ServletActionContext.getActionMapping()得到:
比如:
二是:在getMapping方法中将ActionMapping中的参数压入request中,然后在action中定义同名的变量,生成GET,SET方法,然后就能直接引用了,比如:
比如原先的某一URL为:http://localhost:8080/article/article!listItems.shtml?article.id=297ef77923fe21850123fe24f405000f,
现在改为了:http://localhost:8080/article/article/listItems/297ef77923fe21850123fe24f405000f.shtml。去掉了“!”和“?”,而且他比REST格式的URL还要实在些。
- 1、域名/namespace/action的名字/方法名.shtml
- 2、域名/namespace/action的名字/方法名/默认为id的参数值.shtml
- 3、域名/namespace/action的名字/方法名/参数1的名字/参数1的值/参数2的名字/参数2的值…….shtml
后缀“.shtml”根据需要可以去掉。与REST式URL的不同在于,优点:
- 1、不仅限于零配置;
- 2、URL中的方法名可以随意,不用像rest式的是默认约定的方法名;
缺点:没有实现REST式XML等的功能,不过也可以实现。
实现思路及代码(照抄ss3ex中的代码):
1、写个自定义RestfulActionMapper 类,实现ActionMapper接口,其实也可以直接继承DefaultActionMapper,但是写的代码要多些。
package com.utils; import java.net.URLDecoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.struts2.RequestUtils; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.mapper.ActionMapping; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; /* * 自定义URL格式 * @Author sanshang */ public class RestfulActionMapper implements ActionMapper { protected static final Logger LOG = LoggerFactory .getLogger(RestfulActionMapper.class); String ACTION_EXT_NAME = ".shtml"; public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) { String nameSpace = ""; String actionName = ""; String method = ""; HashMap<String, String> parameters = new HashMap<String, String>(); String uri = RequestUtils.getServletPath(request); // 去掉后缀 if (!uri.endsWith(ACTION_EXT_NAME)) { return null; } else { uri = uri.substring(0, uri.lastIndexOf(ACTION_EXT_NAME)); } int nextSlash = uri.indexOf('/', 1); if (nextSlash == -1) { return null; } String[] parse = uri.split("[///]"); if (1 < parse.length) { nameSpace = uri.substring(1, nextSlash); } if (2 < parse.length) { actionName = parse[2]; } if (3 < parse.length) { method = parse[3]; int beginIndex = ("/" + nameSpace + "/" + actionName + "/" + method) .length(); try { if (uri.length() > beginIndex) { StringTokenizer st = new StringTokenizer(uri .substring(beginIndex + 1), "/"); boolean isNameTok = true; String paramName = null; String paramValue; // check if we have the first parameter name if ((st.countTokens() % 2) != 0) { isNameTok = false; paramName = "id"; } while (st.hasMoreTokens()) { if (isNameTok) { paramName = URLDecoder.decode(st.nextToken(), "UTF-8"); isNameTok = false; } else { paramValue = URLDecoder.decode(st.nextToken(), "UTF-8"); if ((paramName != null) && (paramName.length() > 0)) { parameters.put(paramName, paramValue); } isNameTok = true; } } } } catch (Exception e) { LOG.warn("Cannot determine url parameters", e); } } return new ActionMapping(actionName, "/"+nameSpace, method, parameters); } public ActionMapping getMappingFromActionName(String actionName) { return new ActionMapping(actionName, null, null, null); } /* * (non-Javadoc) * * @see * org.apache.struts2.dispatcher.mapper.ActionMapper#getUriFromActionMapping * (org.apache.struts2.dispatcher.mapper.ActionMapping) */ public String getUriFromActionMapping(ActionMapping mapping) { String base = mapping.getNamespace() + "/" + mapping.getName(); if (StringUtils.isNotBlank(mapping.getMethod())) { base = base + "/" + mapping.getMethod(); } for (Iterator iterator = mapping.getParams().entrySet().iterator(); iterator .hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); String name = (String) entry.getKey(); if (name.equals("id")) { base = base + "/" + entry.getValue(); break; } } return base; }
}
2、修改struts.properties文件中的默认配置
# struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper struts.mapper.class=com.utils.RestfulActionMapper struts.enable.SlashesInActionNames=true
3、在action中得到ActionMapping中的参数的方法,有2种办法,一是在action中写个方法,利用ServletActionContext.getActionMapping()得到:
/* * 得到ActionMapping中的参数,如果参数为空,就默认返回id的值 */ protected String getParams(Object... key) throws Exception { ActionMapping mapping = ServletActionContext.getActionMapping(); Map map = mapping.getParams(); if (null != map) { if (key.length == 0) { if (map.containsKey("id")) { return map.get("id").toString(); } return ""; } else { return map.get(key[0].toString()).toString(); } } return ""; }
比如:
setPage(articleService.getAllArticleForPage(page, getParams()));
二是:在getMapping方法中将ActionMapping中的参数压入request中,然后在action中定义同名的变量,生成GET,SET方法,然后就能直接引用了,比如:
getId()。
发表评论
文章已被作者锁定,不允许评论。
-
Document对象内容集合
2010-09-18 12:18 946Document对象内容集合 document 文挡对象 - ... -
tomcat6配置https
2010-03-04 12:37 4249tomcat6配置双向认证 1、 ... -
maven-eclipse-plugin 与aspectj
2010-02-06 17:32 7716问题1:最近一段时间以来,项目中使用maven-eclipse ... -
linux中使用broadcom型号卡上网
2010-01-19 15:31 4203确认下网卡型号: sansha ... -
用nginx-0.8.32和一个tomcat6.0.20搭建ss3ex
2010-01-15 14:14 15801、下载nginx-0.8.32和一个tomcat6.0.20 ... -
用apache_2.2.14和tomcat6.0.20搭建ss3ex
2010-01-13 18:40 17251、安装apache_2.2.14-win32-x86-no_ ... -
nginx+tomcat配置负载均衡和集群
2010-01-12 16:25 18171、下载nginx(nginx/Windows-0.8.32) ... -
ss3ex与Lingo,ss3中spring security2使用的差别
2009-10-29 09:32 2489spring security2中实现数据库管理认证和授权,版 ... -
WEB框架中异步实现方案
2009-10-22 22:15 1686异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是 ... -
实现线程内和线程间传值,合理使用ThreadLocal
2009-10-10 08:55 6621以下均在ss3ex环境中 1、理解线程 用户请求一个URL,所 ... -
Struts2中页面上访问后台static类中的方法
2009-09-14 19:05 14791、在struts.xml中保证(或者设置) <cons ... -
读取excel文件
2009-09-09 10:41 1363读取excel文件 -
不用session、request传值的另一种解决方案
2009-08-13 19:40 1658不用session、request传值的另一种解决方案: pu ... -
发布ss3ex的maven版本,取名叫sango吧
2009-07-19 23:19 1246都在用maven,跟上步伐,发布一个maven版本的s ... -
tomcat调试maven2项目
2009-07-16 21:49 4790一、搭建maven项目(目的 ... -
eclipse3.4安装m2eclipse
2009-07-15 10:50 2964工作需要,必须要使用maven2。 eclipse版本:ecl ... -
kindeditor上传图片的修改
2009-06-27 12:19 19642最近做新闻系统,用了kindeditor,其中上传图片 ... -
预先抓取,外连接,和直接查询三者直接的区别
2009-06-15 17:51 1156预先抓取,外连接,和直接查询三者直接的区别: [1]. 预先抓 ... -
值集合映射 annotation
2009-06-15 13:29 913值集合映射 @CollectionOfElements ... -
ss3ex中Hibernate的乐观锁使用
2009-06-12 15:41 1497Hibernate支持乐观锁。当多个事务同时对数据库表 ...
相关推荐
在SS3EX框架中,UrlRewrite的使用是为了解决传统URL模式中参数过多、过于复杂的问题,提供一种更简洁、更美观的URL表示方式。下面将详细介绍SS3EX中使用UrlRewrite的相关知识点。 首先,URL重写主要是通过配置文件...
总结来说,这个项目是关于将ss3ex转换成一个支持Maven的Java项目,便于管理和构建,同时也可能提供了一种工具,帮助开发者在他们的工作中更高效地使用或集成ss3ex。通过博客链接提供的信息,读者可以深入了解这个...
2007卡耐基软件工程网路教材 SSD3ex2答案
ssd3ex5源码,自己写的,保证100分!
文件列表中的"ss3ex.bmp"可能是一个项目标识或图标,它可能包含了项目的视觉元素,帮助识别项目。而"ss3ex"可能是项目的主干代码或者扩展模块,包含了对SpringSide3核心功能的增强和定制。 这个项目的源代码分析,...
例如,`ch3ex6.m`, `ch3ex5.m`, `ch2ex3.m`, `ch4ex5a.m` 和 `ch2ex4.m` 可能是书中的练习题,每个对应一个特定章节的实例,可能涵盖了不同主题的MATLAB编程实践。 3. **图像处理**: 标签"图像处理与计算机视觉...
博客链接(https://ss3ex.iteye.com/blog/436901)可能包含了关于如何在Maven项目中集成和配置iBatis的实践教程,读者可以通过阅读该博客获取更具体的步骤和示例代码。 综上所述,"maven版ibatis"的主题涵盖了Maven...
描述中提到的“源代码”表明该压缩包可能包含了用于教学目的的Java编程代码,这通常是为了实现特定的SSD管理功能或者进行性能测试。 在标签中,“SSD3”可能是课程的代号,而“JAVA”则指明了编程语言,这意味着...
它以其高容量、高速度、低成本和可靠性获得了广泛应用,尤其是在非营利组织中,如科罗拉多盲人护助中心。 1. **高容量与高速度**: AIT-3Ex是Sony AIT系列的升级版本,提供了显著的存储性能提升。在未压缩状态下,...
派特莱LCE-A 多层信号灯2D CAD Pole M2pdf,特点:高节能无需维护的LED多层信号灯,体积小可识别性强,特别匹配于各类中小型设备的外观设计。派特莱特有的混合棱镜切割灯罩,消除了可能存在的视觉盲点,大大提高了远...
Sizzle 是一套前端用智能来处理模块和组件依赖关系的框架。 它遵循 CommonJS 的运行规范来完成对各个模块的动态加载。...Sizzle 框架将被使用在 PJBlog4 新版本中,让后台更加代码逻辑化和模块化。
在`main`函数中,我们检查命令行参数的数量,如果存在,则将第一个参数作为MP3文件的路径传递给`LoadFileID3Ex`函数。如果没有提供参数,程序将不会显示任何信息。 此外,注意到在代码中还有回调函数`CallbackFunc`...
开发者可以根据需求对这些模板进行自定义修改,以适应特定的项目或品牌风格。同时,为了保证在各种设备上的兼容性和性能,还需要考虑响应式设计和优化,确保网站在不同分辨率和浏览器上都能良好运行。
3. **期望(数学期望)**(Expectation):随机变量的期望表示其平均值,如第4题中的EX=,第9题中的EX=np=1.6,第13题中的E(z)=3EX-2。 4. **方差(Variance)**:随机变量的方差衡量其数值离散程度,如第4题中的DX...
Root权限是指在Android操作系统中获取最高管理员权限,允许用户对系统的底层进行修改和控制。对于喜欢自定义手机系统的用户来说,Root权限能够提供更多的自由度和可能性。但需要注意的是,Root操作可能会导致手机...
2. **适用**:此协议适用于所有使用HBP-9021/9020的通信场景,无论是在设备的开发阶段还是实际操作过程中。 3. **连接构成**:在PC与主CPU进行通信时,它们通过RS232C串行通信端口相连,具体是通过UART接口的TxD...
【压缩包子文件的文件名称列表】中的文件可能分别对应课程的不同单元,如BI-U03_3EX.ppt可能是第三单元的练习讲解或答案解析,BI-U04_3EX.ppt可能是第四单元的内容。这些PPT文件可能包含了课件展示、习题解析、语言...