- 浏览: 100120 次
- 性别:
- 来自: 北京
最新评论
-
zgmws1978:
抄袭人家的吧
Extjs4.0 实现的后台管理模块 (包含前后台源码) -
luojia.smilence.:
这都下载不了,楼主更新一下链接吧。
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载 -
429537044:
楼主你好,我想请问一下。 你在MyAccessDecision ...
Spring Security3.1 最新配置实例(spring权限管理) -
jiang_xiaohan:
在别处看过,下载过源码,但没架包的,hibernate我又不熟 ...
Spring Security3.1 最新配置实例(spring权限管理) -
yhr619:
写得挺好的
Spring Security3.1 最新配置实例(spring权限管理)
欢迎访问我的社区资源论坛http://www.javadt.com
【前言】所谓快速开发,实质上为了节省项目的开支成本,减少程序员的开发时间,固然就形成了种种二次封装的框架,也就是造轮子,然后我们的程序就按照这个轮子去画瓢,这里我就把公司这几次开发系统的框架源码贴出来,做一下讲解以及使用示范,并有附件提供参考,希望能给各位在基于后台管理系统提供帮助。
【目录】
讲解分为3部分:
1.struts2的配置
2.struts2的基类构成
3.具体实例应用
【内容】
一、struts2的配置
1 .struts2的过滤器拦截配置 :相信大家对struts2的配置一定不陌生,这里我就简单带过struts2过滤器在web.xml的配置:
<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.action</url-pattern></filter-mapping>
2 .struts2全局配置:这里我要做一点介绍了,按常理来讲,我们都是基于约定大于配置的原则,不做重复劳动的思想:
A.基于Annotation的配置(struts2有一种叫convention的插件,可以实现零配置,具体可以参 考http://hi.baidu.com/millionware/blog/item/2a672b0b81e89134b0351d46.html,我就不做讲解,注:这里的零配置是针对struts2在xml中配置)。
B.采用通配符进行配置,也就是我推荐的,也是我们项目中用到的一种方法,先上代码struts.xml:
<?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="default" namespace="/" extends="struts-default"><global-results><result name="error">/page/error.jsp</result>(1)<result name="input"></result>(1)<result name="login" type="redirect">/login.jsp</result>(1)<result>${target}</result>(2)<result type="redirectAction" name="redirectAction">${target}</result>(2)<result type="redirect" name="redirect">${target}</result>(2)</global-results></package><package name="app" namespace="/" extends="default">(4)<action name="*/*/*" class="st.{1}.web.{2}Action" method="{3}">(3)</action></package></struts>
解析:上面我对配置文件中加入(1)、(2)、(3)、(4),表示对此处的标注,下面我就对这些部分进行解析。
(1):如果有用过struts2的童鞋,可以清晰的看出它们名称都很有含义,对没错 struts2的Action类已经封装这4个静态常量,当我们在Action的方法中完成操作后,要对视图进行 跳转或者响应时,要返回一个字符串,比如:return SUCCESS;那么这个SUCCESS实际上就是对应我们在struts2配置的xxxx.jsp,简化一下也就是xxx.jsp,默认的result name就是"success" 默认的type是dispatch 也就是JSP视图,那么这样我们就可以对这些预定好的变量配置他们响应的跳转视图页面。
(2) :很奇怪为什么有个${target},${target}只是作为struts2的配置的占位参数,而基类BaseAction中我们存放了一个target变量,当解析struts.xml时,可以从我们实现类中读 取出来,然后进行替换,这样做的好处是什么,很显然,我们要返回的jsp页面有成千上万种,我不可能每次都去配置 a.jsp b.jsp....,这样可以说是实现了统一设置路径,也就是通配,而且还有不同类型的返回,type="redirect"/ type="redirectAction",看上去好像是一样的,区别在于redirectAction可以指定重定向到某个action上(struts2中配置的action),target就是Action的name,值得注意的是我这里只是罗列了重定向以及Jsp视图的类型,要知道还有其他N多种类型的视图,怎么办?我先把关于模板类型的返回的告知出来以freemaker为例,其他见基类BaseAction:
struts.xml 中加入freemaker" name="freemaker">${target} ,其实道理是一样 只是type不一样而已,target="xxxx.ftl";
(3):这个是很重要的,我们所有的action都用了通用,原则是:{模块名}/{用例名}/{方法}.action
比如:st.sys.web.UserAction.java - sttbas_server/src/java这样一个类,我们访问它的查询方法:sys/User/view.action,很简单。
(4):我们这个名为app的package继承了 default包,也就意味可以重用default的配置。
好像struts.xml少了点什么东西,对我们没有配置它的属性,这里我们将struts2的属性配置进行区分,也是官方推荐的设置将struts.xml,与struts.properties分开,并放入classpath目录下,struts.properties内容如下:
#允许使用下划线#struts.enable.SlashesInActionNames=true //必须要的,因为我们配置Action时用了下划线#spring做为对象管理工厂#struts.objectFactory=spring#开发模式#struts.devMode=false//开发阶段可以开启这个模式#静态缓存#struts.serve.static.browserCache=false //开发阶段可以开启#配置是否重新加载#struts.configuration.xml.reload=true //建议开启,方便调试,发布版本的时候可以关闭
当然还有很多属性的配置,详细见:
http://www.blogjava.net/hadeslee/archive/2008/12/03/244199.html或者可以参考struts2源码包中struts.properties
二、struts2的基类
package com.st.web.action;import java.io.IOException;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.struts2.ServletActionContext;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.opensymphony.xwork2.Preparable;import com.st.utils.AjaxMsg;import com.st.utils.JsonUtil;/*** @author fisher* @description Action公共基类* @param 所有对象类型*/public abstract class BaseAction extends ActionSupport implementsModelDriven, Preparable, SessionAware, ServletRequestAware,ServletResponseAware {/****/private static final long serialVersionUID = 1L;protected Log log = LogFactory.getLog(getClass());// -- header 常量定义 --//private static final String HEADER_ENCODING = "encoding";private static final String HEADER_NOCACHE = "no-cache";private static final String DEFAULT_ENCODING = "UTF-8";private static final boolean DEFAULT_NOCACHE = true;// -- Content Type 定义 --//public static final String TEXT_TYPE = "text/plain";public static final String JSON_TYPE = "application/json";public static final String XML_TYPE = "text/xml";public static final String HTML_TYPE = "text/html";public static final String JS_TYPE = "text/javascript";public static final String EXCEL_TYPE = "application/vnd.ms-excel";public static final String IMG_TYPE = "image/jpeg";// -------------------- 作用域对象 --------------------///** sessionMap对象 */private Map sessionMap;/** request对象 */private HttpServletRequest request;/** response对象 */private HttpServletResponse response;/** ajax消息 */public static final AjaxMsg ajaxMsg = new AjaxMsg();// --------------------视图跳转路径------------------///*** 例如:"index.jsp index.ftl"*/private String target;// -- Preparable函数 --///*** 实现空的prepare()函数,屏蔽了所有Action函数都会执行的公共的二次绑定.*/public void prepare() throws Exception {}// -------------绕过jsp/freemaker直接输出文本函数-------------//// -- 绕过jsp/freemaker直接输出文本的函数 --///*** 直接输出内容的简便函数. eg. render("text/plain", "hello", "encoding:GBK");* render("text/plain",hello", "no-cache:false");* render("text/plain","hello", "encoding:GBK","no-cache:false");** @param headers* 可变的header数组,目前接受的值为"encoding:"或"no-cache:",默认值分别为UTF-8和true.*/public static void render(final String contentType, final String content,final String... headers) {HttpServletResponse response = initResponseHeader(contentType, headers);try {response.getWriter().write(content);response.getWriter().flush();} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}}public static void renderImg(final String img, final String... headers) {render(IMG_TYPE, img, headers);}/*** 直接输出文本.** @see #render(String, String, String...)*/public static void renderText(final String text, final String... headers) {render(TEXT_TYPE, text, headers);}/*** 直接输出HTML.** @see #render(String, String, String...)*/public static void renderHtml(final String html, final String... headers) {render(HTML_TYPE, html, headers);}/*** 直接输出XML.** @see #render(String, String, String...)*/public static void renderXml(final String xml, final String... headers) {render(XML_TYPE, xml, headers);}/*** 直接输出JSON.** @param jsonString* json字符串.* @see #render(String, String, String...)*/public static void renderJson(final String jsonString,final String... headers) {render(JSON_TYPE, jsonString, headers);}/*** 直接输出JSON,使用fastJson转换Java对象.** @param data* 可以是List, POJO[], POJO, 也可以Map名值对.* @see #render(String, String, String...)*/public static void renderJson(final Object data, final String... headers) {String jsonString = JsonUtil.serialize(data);renderJson(jsonString, headers);}public static void renderJson(final Object data,final String[] propertyFilter, final boolean isInclude,final String... headers) {String jsonString = JsonUtil.serialize(data, propertyFilter, isInclude);renderJson(jsonString, headers);}/*** 分析并设置contentType与headers.*/private static HttpServletResponse initResponseHeader(final String contentType, final String... headers) {// 分析headers参数String encoding = DEFAULT_ENCODING;boolean noCache = DEFAULT_NOCACHE;for (String header : headers) {String headerName = StringUtils.substringBefore(header, ":");String headerValue = StringUtils.substringAfter(header, ":");if (StringUtils.equalsIgnoreCase(headerName, HEADER_ENCODING)) {encoding = headerValue;} else if (StringUtils.equalsIgnoreCase(headerName, HEADER_NOCACHE)) {noCache = Boolean.parseBoolean(headerValue);} else {throw new IllegalArgumentException(headerName+ "不是一个合法的header类型");}}HttpServletResponse response = ServletActionContext.getResponse();// 设置headers参数String fullContentType = contentType + ";charset=" + encoding;response.setContentType(fullContentType);if (noCache) {// Http 1.0 headerresponse.setDateHeader("Expires", 1L);response.addHeader("Pragma", "no-cache");// Http 1.1 headerresponse.setHeader("Cache-Control", "no-cache, no-store, max-age=0");}return response;}/*** @description 获取磁盘物理路径* @return String*/protected String getRealPath() {return request.getSession().getServletContext().getRealPath("");}/*** @description 得到session对象* @return Session*/protected HttpSession getSession() {return this.request.getSession();}/*** @Title: getParams* @Description: 得到页面所有参数* @return Map* @throws*/public Map getParameters() {return ActionContext.getContext().getParameters();}/*** @description 设置session对象Attribute属性* @param key* @param value*/protected void setSessionAttribute(String key, Object value) {sessionMap.put(key, value);}/*** @description 返回session对象的Attribute属性* @param key* @return Object*/protected Object getSessionAttribute(String key) {return sessionMap.get(key);}/*** @description 清除整个session*/protected void clearSession() {sessionMap.clear();}/*** @description 清除session中指定的内容* @param key*/protected void remove(Object key) {sessionMap.remove(key);}/*** @description 通过request获取页面参数值* @return string*/protected String getParameters(String name) {return (null != request.getParameter(name)) ? request.getParameter(name) : null;}/*** @description 获取项目根目录* @return String*/protected String getRootPath() {return request.getContextPath();}/*** @description 获取request独享* @return*/public HttpServletRequest getRequest() {return request;}/*** @description 获取response对象* @return*/public HttpServletResponse getResponse() {return response;}/*** @description 获取sessionMap* @return*/public Map getSessionMap() {return sessionMap;}public String getTarget() {return target;}public void setTarget(String target) {this.target = target;}public void setServletResponse(HttpServletResponse response) {this.response = response;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setSession(Map sessionMap) {this.sessionMap = sessionMap;}}
解析:1.接到上面struts2的配置问题来说,可以看到我们在配置result的时候存在占位参数${target},那这个target是哪里来的?可以看到,BaseAction中已经包含这个变量,并且提供get方法,有童鞋会问为什么这样子对target设置就能替换${target},我只能说这是OGNL的一种机制。
2.可以看出baseAciton中定义了很多常量,怎么用?这些常量定义是为了处理response的响应头,上面我有讲过,我没有在struts.xml中处理流返回类型,json返回类型,对吧?很显然是要在这里做操作了撒,可以看出有很多render开头的重载方法,这些方法就是帮助我们直接去响应前台,后面例子中我会附带系统中struts2对json处理、对流文件(excel、img)处理。
3.实现了很多接口,值得注意的是Preparable和ModelDriven。注意这个BaseAction是泛型,就是因为ModelDriven(模型驱动),有了它我们可以直接由ModelDriven的interceptor拦截前台参数,把参数分装成我们指定的泛型类型的对象,而Preparable则是提供给一个预处理接口,让在执行Action方法之前执行。其他几个几口是帮助我们获取作用域对象,session、request。
4.附件中会包含基类的引用类,JsonUtil(json工具类)以及AjaxMsg(ajax消息类,针对Json消息)
三、具体示例
示例我写得很简单,大概就是举例一下,如何进行前后台的交互,以及响应不同返回类型。由于帖子长度有限,所以基类的代码何示例代码大家只有下载了,写这篇文章耗费了我3个小时,由于文笔水品有限,有瑕疵的地方,请大家指正批评。
- 附件.zip (7.2 KB)
- 下载次数: 4
发表评论
-
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载
2012-05-07 13:39 3071史上最全的安卓android开发各种书籍资料整理包括书籍 ... -
收集整理的oracle常用命令大全,解决oracle常见问题
2012-05-02 12:51 4744一、ORACLE的启动和关闭 1、在单机环境下 要 ... -
史上最全html及html5的学习资料文档收集整理包括介绍和下载
2012-04-28 09:21 3304下面是我收集整理的一些关于html5的相关文档和资料,有文档介 ... -
大量的javascript学习资料包括文档介绍下载和源码等
2012-04-26 09:49 1769下面是整理的大量关于javascript的一些资料文档等的介绍 ... -
Java中将中文姓名转换为拼音的简单实现
2012-04-25 09:15 3787以下是源代码:import net.sourceforge.p ... -
SQL语句使用大全,最常用的sql语句
2012-04-23 10:38 2752下列语句部分是Mssql语 ... -
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载
2012-04-19 10:48 1063史上最全的安卓androi ... -
史上最全的Eclipse各种书籍资料整理包括书籍介绍和下载
2012-04-18 11:02 2511史上最全的Eclipse各种书籍资料整理包括书籍介绍和下 ... -
史上最全的jquery框架各种书籍整理包括书籍介绍和下载
2012-04-17 19:35 2039下面是我近期整理的几乎囊括了所有的jquery的教程和学 ... -
ajax框架prototype.js的各大文档整理积累文档的介绍和下载
2012-04-16 08:03 1167下面是整理的ajax框架prototype框架的一些文档 ... -
Microsoft Silverlight 4.0 介绍[PDF]
2012-04-15 18:55 1393Microsoft Silverlight 4.0 ... -
XML详细入门教程[PDF]
2012-04-15 18:40 2298本文档是一份很详 ... -
webQQ协议java的实现方法
2012-04-13 10:39 2335转载自:http://www.javadt.com/arti ... -
“为什么有钱有权的都移民了”?“贫贱不能移!”
2012-04-13 10:12 3转载自:“为什么有钱有权的都移民了”?“贫贱不能移!” ht ... -
JAVA 部署TOMCAT+IIS配置方法
2012-04-12 12:58 2735本文转载自:http://www.javadt.co ... -
android开发环境搭建以及配置方法[PDF]
2012-04-12 09:59 1023转载自:http://www.javadt.com/artic ... -
《JAVA代码规范》(六)通用代码格式 - 语句、SQL(2.9-2.10)
2012-04-12 21:40 1168转载自:http://www.javadt.c ... -
《JAVA代码规范》(五)通用代码格式 - 声明(2.8)
2012-04-11 20:56 873转载自:http://www.javadt.com/threa ... -
《JAVA代码规范》(四)通用代码格式 - 注释(2.7)
2012-04-11 20:55 1187转载自:http://www.javadt.c ... -
《JAVA代码规范》(三)通用代码格式 - 缩进、行长度、换行、空行、空格(2.2-2.6) ... ...
2012-04-11 20:54 8325转载自:http://www.javadt.com/threa ...
相关推荐
扁平式插画是一种源于互联网时代的艺术与设计风格,它摒弃了复杂的层次感、阴影、质感和投影等传统设计元素,强调通过简洁的图形和色彩直接传达信息。这种设计风格自出现以来,迅速成为互联网设计领域的一种流行趋势...
冯威《数与图的完美结合——浅析差分约束系统》
智能导播助力2021春晚新媒体节目创新——浅析人工智能切换技术的应用.pdf
完善·共赢——浅析熙盛恒车新版联网O2O平台.pdf
浅析Struts框架下的Java Web应用 Struts框架是基于MVC模式的开源框架,它能够有效实现系统开发中逻辑层和表示层的分离,促使逻辑层和表示层的彼此独立,从而大大减轻多层Web构建过程中的负担,提高了系统开发和应用...
高中创新教育 开启人生里程——浅析智能模拟驾驶系统的使用.pdf
我国古代文学——浅析屈原与李白的浪漫主义诗风及其继承关系.doc
本文以网易考拉海购的实践为例,深入分析了跨境电商物流信息系统构建的必要性、系统功能、现存问题及解决方案。 一、我国跨境电子商务发展现状 跨境电商作为电子商务的一个重要分支,近年来在中国得到了迅猛发展。...
整合·建构·发现——浅析《建筑CAD》教学的关键点.pdf
日本档案职业资格认证研究——浅析《日本档案学会注册档案员规程》.pdf
《左秋芳——浅析幼儿园双语教学》这篇文档,主要探讨了在幼儿教育阶段实施双语教学的重要性和策略。双语教学,顾名思义,是指在同一教学环境中,同时使用两种语言进行教学,旨在帮助儿童掌握两种或多种语言的能力。...
<br>提高页面显示速度的秘技 <br>用CSS使网页图片半透明 <br>网页小技巧:随心所欲的分隔线 <br><br> <br>网页常用特效整理:初级篇<br>网页常用特效整理:高级篇<br>网页常用特效整理:中级篇 <br><br><br><br>表格...
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> ``` 并且指定了URL模式为`/*`,意味着所有请求都会被此过滤器拦截。 ```xml ...
Struts2是一个开源的MVC(Model-View-Controller)架构的Web应用框架,它融合了WebWork框架的核心设计思想以及Struts1的一些优秀特性。Struts2旨在简化Web应用程序的开发流程,提供更为灵活、强大的处理机制。它支持...
xml=<data><config><isShowTitle>0</isShowTitle><autoPlayTime>5</autoPlayTime></config><channel><item><link></link><image>images/0411412705084558.jpg</image><title></title></item><item><link></link>...
GCC编译流程:从源代码到可执行程序——浅析编译原理 GCC编译流程是从源代码到可执行程序的整个过程,可以分为四个阶段:预处理、编译、汇编和链接。下面将对这些阶段进行详细介绍: 1. 预处理阶段: 在预处理...
### 小名片大用途——浅析校园植物名片制作活动 #### 活动背景与目的 在当前教育背景下,远东版小学自然教材注重通过实践活动加深学生对自然界的理解和认识。其中,校园植物名片制作活动作为一项综合性的实践项目,...
《进化及融合——浅析西方传统造园和中国传统造园的演变趋势》 园林艺术,作为人类文明的重要组成部分,承载着文化和审美的厚重历史。在世界范围内,园林艺术大致可分为东西方两大体系,两者在造园理念、手法以及...