- 浏览: 234718 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
清林小篆:
引用[/col[size=xx-small][/size]or ...
tomcat ssl配置以及CAS单点登录探究 -
cyxy99:
u012534143 写道我用同样的方法,同样的节点关系,为什 ...
PageRank算法java实现版本 -
cyxy99:
schaha123 写道楼主还有一个问题想请教一下,下面这2段 ...
PageRank算法java实现版本 -
njthnet:
Participle 和 IkParticiple 这2个类找 ...
贝叶斯文本分类 java实现 -
u012534143:
我用同样的方法,同样的节点关系,为什么的得到的结果与您不一样呢 ...
PageRank算法java实现版本
mvc框架最基础的功能就是跳转,struts2支持注解+xml配置跳转,我个人认为用注解来配置跳转不是一个好的做法,看似比较简单,但是action多了之后查找起来比较不方便,而且把配置信息放在类里面实际上跟解耦理念是相悖的(不过每个人有自己喜好),所以在这里我打算把跳转层设计成xml配置的,其他层设计成注解的。
配置跳转需要用到的知识有:反射,xml读取。反射是实现动态装配的基础,它使我们的程序更具动态性,可扩展性,几乎所有流行的框架都以它为基础实现。xml读取基本都会采用dom4j完成。
mvc实现跳转的过程:xml配置命名空间,Action处理类,请求的action方法和跳转的页面,在form提交请求后,被中心Servlet处理,解析出请求的路径,根据xml配置的各种信息,反射调用目标Action类的处理方法,并且根据xml配置的目标跳转页面进行跳转。
所以,我们提炼出的 核心配置有
1,namcespace:命名空间,不同模块有不同的namespace,
2,name:form请求的名字。
3,method:name对应的Action处理方法名,会被反射调用
4, class:Action处理类的全路径,用于在中心Servlet反射生成.
5, result子标签:Action处理后的跳转页面,跳转方式为forward或redirect
我们新建一个web工程(Eclipse),取名MVC。
接着新建一个Servlet,取名MainServlet,做中心处理器用。
src目录下新建control.xml当作跳转配置文件,control.xml如下
配置web.xml,使其拦截所有action结尾的请求,我的配置如下:
之所以把CONTROL_CONFIG 配制成
classpath:control.xml是因为更好的读取不同路径下的文件。
这样,所有.action的请求都会进入MainServlet这个中心处理器,并且把配置文件一并传入,在servlet初始化(init()方法会在第一次请求时调用
)阶段读取配置文件信息,并缓存起来。
一般来说,资源管理类都可以设计成单例,即满足应用需要,又节省内存,并且代码看起来更加清晰,所以我这里新建ControlXml类,用来专门读取control.xml文件
在实现此类之前,还需要把配置文件各元素对应成不同javabean,类对应如下
Namespace持有ActionVo列表,ActionVo持有Result列表,ControlXml持有Namespace的map结构就行了。
ControlXML代码如下:
代码中注释的部分以后会有详细讲解,事实是只要代码结构清晰,增删功能都比较容易。
下面就可以在MainServlet的方法中进行读取了,核心代码如下:
control.xml不一定放在src下,也有可能是web-inf下,所以这里需要多做几次判断,保证在常用目录下可以找到文件,这里默认为src下。
上面是所有解析工作,下一步:编写MainServlet,使其处理各种请求。
解析请求的核心工作分这几步:
1,从requestUri解析namespace,action
2,在配置资源类ControlXml中获得此Namcespace下的action信息,生成Action实例。
3,执行对应的Action方法,根据返回值得到此Action配置的result,跳转到页面。
实现如下:
得到相应Action
反射调用Action的方法,并返回字符串
看起来大致功能都有了,是不是可以测试下,但是?。。。貌似自己的Action里面没有任何request,response的资源?
现在有两种方式可以得到:
1,实现接口(或继承)
2,API得到
有人说第二种方式肯定好点,因为很解耦哦,我觉得不一定,因为我们做任何框架的目标不是为了解耦,只要用着顺手就行,固执的考虑低耦合是效率低下的原因之一,当然,作为一个有理想 有思想的框架,这两种方式都得提供。
其实struts2也遇到过类似问题,解决方式之一是实现资源接口,比如
ServletRequestAwarehue接口,实现它可以获得request,另外还有他的兄弟如ServletResponseAware,SessionAware,ServletContextAware,实现他们可以分别得到response,session,servletContext。
首先我们创建
ContextAction接口,代码如下:
调出MainServlet,在得到action对象后加入设置代码
调出测试Action,声明HttpServletRequest等各种资源对象,实现接口并接收资源,核心代码如下:
。有木有发觉以后每个action都有这些与业务没什么关系的代码,所以一般做法是,做一个BaseAction类实现ContextAction接口,然后让你的Action继承BaseAction,干掉了冗余代码。这也是java模式中常用的缺省模式。
在实现API获取web资源之前,我们仔细想一下tomcat是怎样响应请求的。
请求tomcat时,tomcat从线程池分配一个空闲线程给此请求,经过数据的包装,会在第一次执行MainServlet的时候,执行init方法(执行一次),并且以后所有请求都会执行同一个MainServlet对象,这样就容易造成Servlet的线程安全问题,(HttpServletRequest线程安全的),所以为了在任何地方都能正确的得到请求资源,我们采用ThreadLocal来存储,ThreadLocal本质上是一个 当前线程和值的键值对,所以保证了在当前任何时候访问此对象都能排除多线程变量的干扰,另外在一般情景下会用static修饰ThreadLocal。
实现方式比较简单:
这里仅仅存储了request和response,你还可以自行存储国际化信息,容器信息,或者执行Action的上下文信息等.
再一次说明的是request和response是线程安全的,但是你要达到不通过继承或者传参等方式可以在任何地方都能获得request资源,用threadLocal是最好的选择。
调用方式如下(请对照源代码)
以后在任何请求范围内都可以通过ActionContext.getRequest()和ActionContext.getResponse()得到请求资源或响应
到此我们基本的配置跳转已算完成,可以自行测试一下了。
By 阿飞哥 转载请说明
腾讯微博:http://t.qq.com/duyunfeiRoom
新浪微博:http://weibo.com/u/1766094735
原文地址:http://duyunfei.iteye.com/blog/1773693
配置跳转需要用到的知识有:反射,xml读取。反射是实现动态装配的基础,它使我们的程序更具动态性,可扩展性,几乎所有流行的框架都以它为基础实现。xml读取基本都会采用dom4j完成。
mvc实现跳转的过程:xml配置命名空间,Action处理类,请求的action方法和跳转的页面,在form提交请求后,被中心Servlet处理,解析出请求的路径,根据xml配置的各种信息,反射调用目标Action类的处理方法,并且根据xml配置的目标跳转页面进行跳转。
所以,我们提炼出的 核心配置有
1,namcespace:命名空间,不同模块有不同的namespace,
2,name:form请求的名字。
3,method:name对应的Action处理方法名,会被反射调用
4, class:Action处理类的全路径,用于在中心Servlet反射生成.
5, result子标签:Action处理后的跳转页面,跳转方式为forward或redirect
我们新建一个web工程(Eclipse),取名MVC。
接着新建一个Servlet,取名MainServlet,做中心处理器用。
src目录下新建control.xml当作跳转配置文件,control.xml如下
<? xml version ="1.0" encoding= "UTF-8" ?> < actions> <global-results> <result name="userindex" type="redirect">test/test1.action</result> </global-results> <namespace name= "/test" > <action name= "test1" method= "test1" class= "com.test.action.TestAction" > <result name= "success" type= "forward" >success.jsp </result > <result name= "error" type= "redirect" >error.jsp </result > </ action> <action name= "test2" method= "test2" class= "com.test.action.TestAction" > <result name= "success" type= "forward" >success.jsp </result > <result name= "error" type= "forward" >error.jsp </result > </ action> <action name= "test3" method= "test3" class= "com.test.action.TestAction" > <result name= "success" type= "forward" >success.jsp </result > <result name= "error" type= "forward" >error.jsp </result > </ action> </namespace > </ actions>
配置web.xml,使其拦截所有action结尾的请求,我的配置如下:
<servlet> <servlet-name >mainservlet </servlet-name> <servlet-class >org.love.servlet.MainServlet </servlet-class> <init-param > <description >control action的配置文件路径 不配置,则默认为src根路径的control.xml文件 </description> <param-name >CONTROL_CONFIG </param-name> <param-value >classpath:control.xml </param-value> </init-param > <init-param > <description >字符编码 </description> <param-name >ENCODING </param-name> <param-value >UTF-8 </param-value> </init-param > </servlet > <servlet-mapping > <servlet-name >mainservlet </servlet-name> <url-pattern >*.action</url-pattern> </servlet-mapping >
之所以把CONTROL_CONFIG 配制成
classpath:control.xml是因为更好的读取不同路径下的文件。
这样,所有.action的请求都会进入MainServlet这个中心处理器,并且把配置文件一并传入,在servlet初始化(init()方法会在第一次请求时调用
)阶段读取配置文件信息,并缓存起来。
一般来说,资源管理类都可以设计成单例,即满足应用需要,又节省内存,并且代码看起来更加清晰,所以我这里新建ControlXml类,用来专门读取control.xml文件
在实现此类之前,还需要把配置文件各元素对应成不同javabean,类对应如下
Namespace持有ActionVo列表,ActionVo持有Result列表,ControlXml持有Namespace的map结构就行了。
ControlXML代码如下:
package org.love.servlet.util; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.love.converter.DateConverter; import org.love.converter.FileConverter; import org.love.converter.IntegerConverter; import org.love.converter.TypeConverter; /** * 用来解析控制器的xml文件 * * @author Administrator * */ public class ControlXML { public final static String CONTROL_CONFIG = "control.xml"; private static ControlXML controlXml = new ControlXML(); private Map<String, Namespace> namespaces = new HashMap<String, Namespace>(); private Map<String,TypeConverter> convertMap= new HashMap<String, TypeConverter>(); private Map<String,Result> globalResults= new HashMap<String, Result>(); public Map<String, Result> getGlobalResults() { return globalResults; } private ControlXML() { /*convertMap.put("java.util.Date", new DateConverter()); convertMap.put("java.lang.Integer", new IntegerConverter()); convertMap.put("org.love.po.FilePo", new FileConverter());*/ } public static ControlXML getInstance() { return controlXml; } public void readXml(String xmlurl) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException { /* 读取xml文件 */ SAXReader reader = new SAXReader(); Document document = reader.read( new File(xmlurl)); Element rootElement = document.getRootElement(); /* 读取namespace配置(包含result配置) start */ List<Element> namespaces_list = rootElement.elements("namespace" ); for (Element namespace : namespaces_list) { /* 读取action后的集合 */ Map<String, ActionVo> actions = new HashMap<String, ActionVo>(); /* 读取action配置(包含result配置) start */ List actions_list = namespace.elements("action" ); for (Iterator it = actions_list.iterator(); it.hasNext();) { Element action = (Element) it.next(); ActionVo avo = new ActionVo(); avo.setName(action.attributeValue( "name")); avo.setMethod(action.attributeValue( "method")); avo.setClassName(action.attributeValue( "class")); List<Element> avo_results = action.elements("result" ); Map<String,Result> list_result = new HashMap<String, Result>(); for (Element result : avo_results) { Result rs = new Result(); rs.setName(result.attributeValue( "name")); rs.setType(result.attributeValue( "type")); rs.setUrltext(result.getText().trim()); list_result.put(rs.getName(),rs); } avo.setResults(list_result); actions.put(avo.getName(), avo); } /* 读取action配置(包含result配置) end */ namespaces.put(namespace.attributeValue( "name"), new Namespace( namespace.attributeValue( "name"), actions)); } /* 读取namespace配置(包含result配置) end */ /*读取converter配置 start*/ /*List<Element> converter_list = rootElement.elements("converter"); for(Element convertElement:converter_list){ String type=convertElement.attributeValue("type"); String handle=convertElement.attributeValue("handle"); TypeConverter tc=(TypeConverter)(Class.forName(handle).newInstance()); convertMap.put(type,tc); }*/ /*读取converter配置 end*/ /* 读取 global-results start*/ List <Element> global_results_list = rootElement.elements("global-results"); if(global_results_list!=null && global_results_list.size()>0){ Element global_results=global_results_list.get(0); List<Element> results=global_results.elements("result"); for(Element result:results){ Result rs = new Result(); rs.setName(result.attributeValue("name")); rs.setType(result.attributeValue("type")); rs.setUrltext(result.getText().trim()); globalResults.put(rs.getName(),rs); } } /* 读取 global-results end*/ /* 后续会加上其他配置 */ } public ActionVo getAction(String namespacename, String actionname) { if ( namespaces == null || namespaces.isEmpty()) { throw new RuntimeException( "请确保之前调用了readXml(xml)方法" ); } Namespace ns = namespaces.get(namespacename); ActionVo avo = null; if (ns != null) { avo=ns.getListActions().get(actionname); } return avo; } public Map<String, TypeConverter> getConvertMap() { return convertMap; } }
代码中注释的部分以后会有详细讲解,事实是只要代码结构清晰,增删功能都比较容易。
下面就可以在MainServlet的方法中进行读取了,核心代码如下:
ControlXML controlXml = ControlXML.getInstance(); String control_config = sc.getInitParameter("CONTROL_CONFIG" ); if (control_config == null || control_config.trim().equals("" )) { control_config = Thread.currentThread().getContextClassLoader() .getResource(ControlXML. CONTROL_CONFIG).getFile(); } else if (control_config.startsWith("classpath:" )) { control_config = control_config.split(":" )[1]; control_config = Thread.currentThread().getContextClassLoader() .getResource(control_config).getFile(); } else { control_config = sc.getServletContext().getRealPath("WEB-INF" ) +File. separator+ control_config; } try { controlXml.readXml(control_config); } catch (Exception e) { e.printStackTrace(); }
control.xml不一定放在src下,也有可能是web-inf下,所以这里需要多做几次判断,保证在常用目录下可以找到文件,这里默认为src下。
上面是所有解析工作,下一步:编写MainServlet,使其处理各种请求。
解析请求的核心工作分这几步:
1,从requestUri解析namespace,action
2,在配置资源类ControlXml中获得此Namcespace下的action信息,生成Action实例。
3,执行对应的Action方法,根据返回值得到此Action配置的result,跳转到页面。
实现如下:
String requestURI = request.getRequestURI(); //假如以"/"结尾,则截取url,方便后面解析 if (requestURI.endsWith("/" )) { requestURI = requestURI.substring(0, requestURI.length() - 1); } String namespace = requestURI.substring(0, requestURI.lastIndexOf("/" )); String actionname = requestURI.substring( requestURI.lastIndexOf( "/") + 1, requestURI.lastIndexOf("." ));
得到相应Action
ControlXML controlXml = ControlXML.getInstance(); ActionVo avo = controlXml.getAction(namespace, actionname); Object action = InvocakeHelp.newInstance(avo.getClassName(), null);
反射调用Action的方法,并返回字符串
Object actionValue=InvocakeHelp.invokeMethod(action,avo.getMethod(),null);
首先根据globalResult配置判断是否有此Result,不存在则从各个action的result里获取 Result result = controlXml.getGlobalResults().get(actionValue); if(result== null){ result = avo.getResults().get(actionValue); } //跳转到配置的页面 if ("redirect" .equals(result.getType())) { response.sendRedirect(request.getContextPath() + "/" + result.getUrltext()); } else { request.getRequestDispatcher( "/" + result.getUrltext()).forward( request, response); } InvocakeHelp这个是反射工具类,实现起来不复杂,核心代码如下 public static Object newInstance(String className, Object[] args) { try { Class newClass = Class. forName(className); if (args == null || args. length == 0) { return newClass.newInstance(); } else { Class[] argsClasses = new Class[args.length]; for ( int i = 0; i < args. length; i++) { argsClasses[i] = args[i].getClass(); } Constructor cons = newClass.getConstructor(argsClasses); return cons.newInstance(args); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return null; } public static Object invokeMethod(Object owner, String methodName, Object[] args) { Class ownerClass = owner.getClass(); Class[] argsClass = null; if (args != null && args. length != 0) { argsClass = new Class[args. length]; for ( int i = 0; i < args. length; i++) { argsClass[i] = args[i].getClass(); } } try { Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return null; } /** * 调用对象的set方法 * * @param obj * @param fieldName * @param value * @param fieldType */ public static void callSetMethod(Object owner, String fieldName, Object value) { String setName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Class ownerClass = owner.getClass(); try { Field field=ownerClass.getField(fieldName); Method method = ownerClass.getMethod(setName,field.getType()); method.invoke(owner,value); } catch (Exception e) { e.printStackTrace(); } }
看起来大致功能都有了,是不是可以测试下,但是?。。。貌似自己的Action里面没有任何request,response的资源?
现在有两种方式可以得到:
1,实现接口(或继承)
2,API得到
有人说第二种方式肯定好点,因为很解耦哦,我觉得不一定,因为我们做任何框架的目标不是为了解耦,只要用着顺手就行,固执的考虑低耦合是效率低下的原因之一,当然,作为一个有理想 有思想的框架,这两种方式都得提供。
其实struts2也遇到过类似问题,解决方式之一是实现资源接口,比如
ServletRequestAwarehue接口,实现它可以获得request,另外还有他的兄弟如ServletResponseAware,SessionAware,ServletContextAware,实现他们可以分别得到response,session,servletContext。
首先我们创建
ContextAction接口,代码如下:
/** * 为action提供应用程序,请求,会话等相关的资源 * @author duyf * */ public interface ContextAction { public void setRequest(HttpServletRequest request); public void setResponse(HttpServletResponse response); public void setSession(HttpSession session); public void setServletContext(ServletContext context); }
调出MainServlet,在得到action对象后加入设置代码
if (!(action instanceof ContextAction)) { throw new RuntimeException( "当前版本需要实现ContextAction接口" ); } ContextAction ca = (ContextAction) action; ca.setRequest(request); ca.setResponse(response); ca.setSession(request.getSession()); ca.setServletContext( servletContext);
调出测试Action,声明HttpServletRequest等各种资源对象,实现接口并接收资源,核心代码如下:
protected HttpServletRequest request ; protected HttpServletResponse response ; protected HttpSession session; protected ServletContext servletContext; public void setRequest(HttpServletRequest request) { this. request = request; } public void setResponse(HttpServletResponse response) { this. response = response; } public void setServletContext(ServletContext context) { this. servletContext = context; } public void setSession(HttpSession session) { this. session = session; }
。有木有发觉以后每个action都有这些与业务没什么关系的代码,所以一般做法是,做一个BaseAction类实现ContextAction接口,然后让你的Action继承BaseAction,干掉了冗余代码。这也是java模式中常用的缺省模式。
在实现API获取web资源之前,我们仔细想一下tomcat是怎样响应请求的。
请求tomcat时,tomcat从线程池分配一个空闲线程给此请求,经过数据的包装,会在第一次执行MainServlet的时候,执行init方法(执行一次),并且以后所有请求都会执行同一个MainServlet对象,这样就容易造成Servlet的线程安全问题,(HttpServletRequest线程安全的),所以为了在任何地方都能正确的得到请求资源,我们采用ThreadLocal来存储,ThreadLocal本质上是一个 当前线程和值的键值对,所以保证了在当前任何时候访问此对象都能排除多线程变量的干扰,另外在一般情景下会用static修饰ThreadLocal。
实现方式比较简单:
public class ActionContext { public final static String HTTPREQUEST = "httprequest"; public final static String HTTPRESPONSE = "httpresponse"; private static ThreadLocal<ActionContext> threadLocal = new ThreadLocal<ActionContext>(); public static ActionContext getContext() { return (ActionContext) threadLocal.get(); } public static void setContext(ActionContext context) { threadLocal.set(context); } public static HttpServletRequest getRequest() { return (HttpServletRequest) getContext().get(HTTPREQUEST); } public static HttpServletResponse getResponse() { return (HttpServletResponse) getContext().get(HTTPRESPONSE); } public ActionContext() { } public ActionContext(Map<String, Object> context) { this. context = context; } /* 对象属性 start */ private Map<String, Object> context = new HashMap<String, Object>(); /* 对象属性 end */ /* 对象方法 start */ public Object get(String key) { return context.get(key); } public Object put(String key, Object value) { return context.put(key, value); } /* 对象方法 end */ }
这里仅仅存储了request和response,你还可以自行存储国际化信息,容器信息,或者执行Action的上下文信息等.
再一次说明的是request和response是线程安全的,但是你要达到不通过继承或者传参等方式可以在任何地方都能获得request资源,用threadLocal是最好的选择。
调用方式如下(请对照源代码)
//注入Action Context Map<String, Object> contextMap= new HashMap<String, Object>(); contextMap.put(ActionContext. HTTPREQUEST, request); contextMap.put(ActionContext. HTTPRESPONSE,response); ActionContext. setContext(new ActionContext(contextMap)); ThreadLocal存储会耗费不小的资源,所以用完必须清除掉,为了保险起见,在finally块里调用清除代码: finally{ //释放上下文资源 ActionContext. setContext(null); }
以后在任何请求范围内都可以通过ActionContext.getRequest()和ActionContext.getResponse()得到请求资源或响应
到此我们基本的配置跳转已算完成,可以自行测试一下了。
By 阿飞哥 转载请说明
腾讯微博:http://t.qq.com/duyunfeiRoom
新浪微博:http://weibo.com/u/1766094735
原文地址:http://duyunfei.iteye.com/blog/1773693
发表评论
-
招Java培训老师(还是论坛招人靠谱)
2015-05-10 13:39 556好久没来坛子了,一来就搞这么有目的的事儿。。。 好吧, ... -
动手开发自己的mvc-3----容器该帮我们做什么?(非常的重点)
2013-01-22 13:55 1824注解注入 我们知道,Spring只有一个角色:工厂。这个工厂可 ... -
动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
2013-01-22 13:44 2586当表单提交的内容过多 ,让懒惰的程序员一个个getPara ... -
动手开发自己的mvc (系列)
2013-01-22 14:08 1934到年尾了,整理了一下我Evernote藏的各种文档,打算把ys ... -
整合了一个小的爬取流程框架
2013-01-08 13:04 1312弄了一个小的爬取流程框架,把之前工作中用到的一些小经验 ... -
Mahout各种推荐器的主要特点
2012-12-06 15:17 2993Mahout有很多推荐的实现,各有特点,在这里一并记录 ... -
怎样通过词频得到这个词频的排序?
2012-12-03 14:35 2070在大规模检索中,我们怎样通过已经的词频得到词频的排序 ... -
drools实现自定义业务规则
2012-10-12 11:49 2851最近做财务相关的积分规则,由于这个功能以后涉及到方方面面 ... -
贝叶斯文本分类 java实现
2012-09-25 15:15 12688昨天实现了一个基于贝叶斯定理的的文本分类,贝叶斯定理假 ... -
前段时间做了一个小型的MVC
2012-07-20 13:23 0前端时间做了一个小型的MVC,麻雀虽小,五脏俱全,目前实现的功 ... -
聚类算法之MST算法 java实现版本
2012-07-17 14:20 2804在介绍最小生成树算法(MST)之前,简单说一下平均链接算 ... -
聚类算法之单链接算法java实现
2012-07-05 10:09 4308聚类算法中基于链接的算法大致有三种:单链接算法(s ... -
朴素贝叶斯分类器
2012-05-20 15:25 0NaiveBayes分类器的优点是能得到已知Y的条件下X的 ... -
PageRank算法java实现版本
2012-05-16 16:03 17471PageRank算法是Google的核心搜索算法,在所有 ... -
聚类算法之kmeans算法java版本
2012-04-22 21:34 20900聚类的意思很明确,物以类聚,把类似的事物放在一起。 ... -
昨天做了个小工具DB转pojo,html,sql
2012-03-21 13:15 1776做dbutils时为了方便就做了个小工具,省点小事儿吧。 -
我这儿的讨论(项目小组)区可以进来了
2012-02-28 10:38 150java项目小组群,前几天清了几个破坏气氛者,和不发言 ... -
智能web探究群组建立了
2011-11-24 12:10 1632最近群组已申请成功 ,地址是http://web.gr ... -
Cas https方式改为http方式
2011-09-24 13:02 2347最近项目要测试,来不及申请等待证书,所以先把项目改为http的 ... -
jdk6原生态webservice
2011-06-30 13:38 8927近期做cas 单点登录的时候由于要同步用户信息,所以准备在 ...
相关推荐
spring-webmvc-struts.jar对Struts和Spring整合时需要用到的包
在本项目"spring-mvc-study.zip"中,我们可以深入理解并实践Spring MVC的核心概念和技术。 首先,Spring MVC是Spring框架的一个模块,主要用于处理HTTP请求和响应。它的主要组件包括DispatcherServlet、Controller...
spring-webmvc-5.0.9.RELEASE-sources.jar则包含了源码,可以深入研究Spring Web MVC的实现细节,对于学习和调试都非常有帮助。 九、依赖管理 在实际项目中,Spring Web MVC往往与其他Spring模块如Core、AOP、Data...
总之,`spring-mvc-4.2.xsd`是Spring MVC 4.2版本的核心配置文件,它定义了所有可用的XML配置元素,是理解和使用Spring MVC进行Web应用开发的基础。同时,提供本地的xsd文件可以显著提高开发过程中的便捷性和效率。
总结,"puremvc-js-multicore-framework-master"项目提供了PureMVC在JavaScript环境下的多核实现,通过这个框架,开发者可以高效地构建模块化、可维护的Web应用,同时享受到多核架构带来的性能提升和扩展性优势。...
mvc-4-documentation, Spring MVC 4.2.4 RELEASE 中文文档完整翻译稿.zip"包含了Spring MVC 4.2.4版本的官方文档的中文全译版,这对于中文开发者来说是一个极其宝贵的资源,它可以帮助我们更深入地理解Spring MVC的...
"一个改进版的spring-mvc-showcase"是一个项目示例,它基于Spring MVC框架进行了一些优化和增强。Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序。它提供了一个灵活的模型-视图-控制器(MVC)架构,...
在MyEclipse环境下开发的"springapp"项目,涵盖了Spring MVC的基础配置和核心组件。以下将详细解释这个项目中的关键知识点: 1. **项目结构**: - `src/main/java`:包含所有Java源代码,如控制器(Controller)、...
在MVC-OC-DEMO中,"Model"层可能包含如"MVC-StudentInfo"这样的类,它们用于存储和管理学生信息。这些类通常不直接与用户界面交互,而是通过提供数据和响应控制器的请求来工作。在Objective-C中,可以使用...
标题中的"spring.jar"、"spring-webmvc-struts.jar"和"spring-webmvc.jar"都是Spring框架相关的Java库文件,通常以.jar结尾的文件是Java的归档文件,包含了类、资源和元数据,用于Java应用程序的运行。这些文件在...
**INFO-MVC-PHP** 是一个基于PHP...通过分析和理解INFO-MVC-PHP项目,开发者不仅可以学习到MVC模式的基本原理,还能掌握PHP中实现MVC架构的具体技术,这对于提升Web开发技能和构建自己的PHP应用框架是非常有价值的。
本项目"JAVA开发其他类别jsp+servlet+javaBean实现MVC-jspmvc"就是基于这种模式进行构建的,旨在提供一种组织和分离业务逻辑、数据处理和用户界面的方法。 1. **模型(Model)**:模型是应用程序的核心,负责处理...
在Spring Web MVC Portlet的配置中,我们需要定义portlet的配置类,创建DispatcherPortlet实例,并配置处理器映射器(HandlerMapping)和视图解析器(ViewResolver)。此外,还需要在portlet-context.xml中配置...
本文将详细探讨如何将这三者集成,并通过"spring-mvc-showcase-case1-client"项目实例进行深入解析。 首先,Spring MVC 是一个基于模型-视图-控制器(MVC)设计模式的Web应用框架,它为开发者提供了处理HTTP请求、...
在现代Java Web开发中,Spring MVC和MyBatis是两个非常重要的框架,它们分别负责控制层和数据访问层的处理。Spring MVC作为Spring框架的一部分,提供了强大的MVC(Model-View-Controller)架构支持,而MyBatis则是一...
"spring-mvc-demo"项目提供了一个基础的Spring MVC示例,包括了Controller、Service、DAO层的实现,以及视图模板的配置。开发者可以通过该项目了解如何配置Spring MVC环境,编写Controller,处理请求,以及与数据库...
Angle-3.4-mvc5-jquery 这个压缩包文件包含了两个主要部分:backend-mvc5-jquery 和 backend-mvc5-jquery-seed,它们是基于Microsoft的ASP.NET MVC5框架开发的Web应用程序,利用jQuery进行前端交互。让我们深入探讨...
总的来说,"spring-mvc-test-sample-master"项目是一个很好的学习资源,可以帮助开发者掌握Spring MVC框架的核心特性,以及如何编写和测试基于Spring MVC的应用程序。通过分析和实践,你可以进一步提升自己的Java ...