- 浏览: 659386 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
HkEndless:
不好意思,请问这确定是回调机制吗。你的例子中只是将接口的实现类 ...
Spring CallBack回调机制介绍 -
hanmiao:
写的真乱啊,完全不知所云...
Java如何调用可执行文件和批处理命令 -
junia_1:
junia_1 写道 shock: ...
为什么要使用EJB -
junia_1:
shock:
为什么要使用EJB -
coollifer:
不错
SQL Server数据导入到Oracle中的方法
(1)-理论基础
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同 一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已经被广泛使用。
我们先来看下经典桌面MVC的模型,为了实现显示和数据的分离,我们在视图和模型之间加入一个控制层,视图只能通过控制器来操作模型,也就是数 据层,一旦数据有更新,模型就会通知视图更新自己。在桌面程序中,用户可以直接和视图进行交互,通过对事件的操作,可以触发视图的各种事件,通过控制器, 以达到更新模型或数据的目的。
由于Web应用的复杂程度的日益增加,功能也日益庞大,表示层与数据层的分离也显得日益重要。于是MVC这种架构模式被移植到WEB开发中来也 是很自然的事情,然而,Web程序和Desktop程序是有很大区别的,大家都知道,HTTP协议是无连接的,当用户从服务器拿到一个页面之后,整个交互 过程也就完成了,用户无法知道服务器端状态的更新,除非用户再次发送请求。而且,在Web程序中,是没有事件模型支持的,用户的每个动作都必须转化为对服 务器请求。以往的经验,我们经常把视图和控制器组合起来,一个页面既包含程序的业务逻辑,又包含页面的显示信息。然而,视图是经常变化的,业务逻辑确实相 对比较稳定的。为了解决这个问题,比较流行的做法是让控制器执行业务逻辑,从数据层(模型)中抓取显示相关的数据,而视图仅仅是一段显示代码,没有业务逻 辑。由于请求多种多样,而且在控制器到视图的数据转发部分含有很多相同的逻辑,而且为了方便扩展和管理,于是就有人提出了前端控制器的概念,也就是请求分 发器。分发器的作用主要工作就是将一个request分发到一个合适的处理器上,并将处理返回的包含特定信息的视图返回给客户端。下图展现了现在常用的 Web MVC 的标准模型。
然而,这不是唯一的模型,在ASP.net中,有一种叫做页面控制器的模型。在这种MVC中,并不是令分发器去寻找一个控制器并执行之,而是直接到 达视图并且在继续生成视图之前调用相应的控制器。与传统的MVC模式中的前端控制器对应,这种模式称为页面控制器。页面控制器和前端控制器实现实现之间的 区别在于页面控制器描述的往往是同一个页面中(如类似于控制面板那样的页面)的处理逻辑,不能用于跨多个页面对处理过程进行控制或协调。它是一种Poll 的模型。
对应的,前端控制器是很典型的一种Push的模型,对同一个请求的几个不同的动作,根据业务逻辑处理后的结果分别被压入到response的各个不同部分。
在下文中,我们仅讨论前端控制器这种方式的具体实现。
(2)-核心组件定义
上文中,我们讨论了MVC的架构的基本原理,这里,我们就要开始着手实现一个简单的WEB MVC前端控制器模型。为了实现这个架构的原型,我们必须引入几个新的概念。
- DispatcherServlet:前端控制器,也是整个架构的核心,负责处理和分发请求。
- HandlerMapping:处理器映射,他主要包含的是控制器的列表,对于特定的请求,根据HandlerMapping的映射关系,可以找到特定的控制器。最简单的便是url到控制器的映射。
- HandlerAdapter:对于不同类型的控制器,该类负责把Handler请求处理的结果统一转换成ModelAndView。
- ModelAndView:包含数据和视图的信息,一般包含视图名,和这个视图需要用的数据,这里的Model大家不要误会为模型的概念,它只不过同时包含视图信息及这个视图需要显示的相关信息而已。
- ViewResolver:它View名称解析成View对象。
- View:定义response显示的详细内容。
HandlerMapping:
- package com.google.mvc.web.servlet;
- import javax.servlet.http.HttpServletRequest;
- public interface HandlerMapping {
- String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class .getName() + ".pathWithinHandlerMapping" ;
- Object getHandler(HttpServletRequest request) throws Exception;
- }
package com.google.mvc.web.servlet;import javax.servlet.http.HttpServletRequest;public interface HandlerMapping {String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";Object getHandler(HttpServletRequest request) throws Exception;} HandlerAdapter:
- package com.google.mvc.web.servlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public interface HandlerAdapter {
- boolean supports(Object handler);
- ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
- long getLastModified(HttpServletRequest request, Object handler);
- }
package com.google.mvc.web.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;long getLastModified(HttpServletRequest request, Object handler);} ViewResolver:
- package com.google.mvc.web.servlet;
- public interface ViewResolver {
- View resolveViewName(String viewName) throws Exception;
- }
package com.google.mvc.web.servlet;public interface ViewResolver {View resolveViewName(String viewName) throws Exception;} View:
- package com.google.mvc.web.servlet;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public interface View {
- String getContentType();
- void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
- }
package com.google.mvc.web.servlet;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public interface View {String getContentType();void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception;} ModelAndView:
- package com.google.mvc.web.servlet;
- import java.util.HashMap;
- import java.util.Map;
- public class ModelAndView {
- private Object view;
- private Map<String, Object> model;
- private boolean cleared;
- public ModelAndView() {
- }
- public ModelAndView(String viewName) {
- this .view = viewName;
- }
- public ModelAndView(View view) {
- this .view = view;
- }
- public ModelAndView(String viewName, Map<String, Object> model) {
- this .view = viewName;
- if (model != null ) {
- addAllObjects(model);
- }
- }
- public ModelAndView(View view, Map<String, Object> model) {
- this .view = view;
- if (model != null ) {
- addAllObjects(model);
- }
- }
- public ModelAndView(String viewName, String modelName, Object modelObject) {
- this .view = viewName;
- addObject(modelName, modelObject);
- }
- public ModelAndView(View view, String modelName, Object modelObject) {
- this .view = view;
- addObject(modelName, modelObject);
- }
- public void setViewName(String viewName) {
- this .view = viewName;
- }
- public String getViewName() {
- return ( this .view instanceof String ? (String) this .view : null );
- }
- public void setView(View view) {
- this .view = view;
- }
- public View getView() {
- return ( this .view instanceof View ? (View) this .view : null );
- }
- public boolean hasView() {
- return ( this .view != null );
- }
- public boolean isReference() {
- return ( this .view instanceof String);
- }
- protected Map<String, Object> getModelInternal() {
- return this .model;
- }
- public Map<String, Object> getModelMap() {
- if ( this .model == null ) {
- this .model = new HashMap<String, Object>();
- }
- return this .model;
- }
- public Map<String, Object> getModel() {
- return getModelMap();
- }
- public ModelAndView addObject(String attributeName, Object attributeValue) {
- getModelMap().put(attributeName, attributeValue);
- return this ;
- }
- public ModelAndView addObject(Object attributeValue) {
- getModelMap().put(attributeValue.toString(), attributeValue);
- return this ;
- }
- public ModelAndView addAllObjects(Map<String, Object> modelMap) {
- getModelMap().putAll(modelMap);
- return this ;
- }
- public void clear() {
- this .view = null ;
- this .model = null ;
- this .cleared = true ;
- }
- public boolean isEmpty() {
- return ( this .view == null && this .model == null );
- }
- public boolean wasCleared() {
- return ( this .cleared && isEmpty());
- }
- public String toString() {
- StringBuffer buf = new StringBuffer( "ModelAndView: " );
- if (isReference()) {
- buf.append("reference to view with name '" ).append( this .view).append( "'" );
- } else {
- buf.append("materialized View is [" ).append( this .view).append( ']' );
- }
- buf.append("; model is " ).append( this .model);
- return buf.toString();
- }
- }
package com.google.mvc.web.servlet;import java.util.HashMap;import java.util.Map;public class ModelAndView {private Object view;private Map<String, Object> model;private boolean cleared;public ModelAndView() {}public ModelAndView(String viewName) {this.view = viewName;}public ModelAndView(View view) {this.view = view;}public ModelAndView(String viewName, Map<String, Object> model) {this.view = viewName;if (model != null) {addAllObjects(model);}}public ModelAndView(View view, Map<String, Object> model) {this.view = view;if (model != null) {addAllObjects(model);}}public ModelAndView(String viewName, String modelName, Object modelObject) {this.view = viewName;addObject(modelName, modelObject);}public ModelAndView(View view, String modelName, Object modelObject) {this.view = view;addObject(modelName, modelObject);}public void setViewName(String viewName) {this.view = viewName;}public String getViewName() {return (this.view instanceof String ? (String) this.view : null);}public void setView(View view) {this.view = view;}public View getView() {return (this.view instanceof View ? (View) this.view : null);}public boolean hasView() {return (this.view != null);}public boolean isReference() {return (this.view instanceof String);}protected Map<String, Object> getModelInternal() {return this.model;}public Map<String, Object> getModelMap() {if (this.model == null) {this.model = new HashMap<String, Object>();}return this.model;}public Map<String, Object> getModel() {return getModelMap();}public ModelAndView addObject(String attributeName, Object attributeValue) {getModelMap().put(attributeName, attributeValue);return this;}public ModelAndView addObject(Object attributeValue) {getModelMap().put(attributeValue.toString(), attributeValue);return this;}public ModelAndView addAllObjects(Map<String, Object> modelMap) {getModelMap().putAll(modelMap);return this;}public void clear() {this.view = null;this.model = null;this.cleared = true;}public boolean isEmpty() {return (this.view == null && this.model == null);}public boolean wasCleared() {return (this.cleared && isEmpty());}public String toString() {StringBuffer buf = new StringBuffer("ModelAndView: ");if (isReference()) {buf.append("reference to view with name '").append(this.view).append("'");} else {buf.append("materialized View is [").append(this.view).append(']');}buf.append("; model is ").append(this.model);return buf.toString();}}
这几个类由DispatcherServlet管理和控制,以下是它们的序列图:
这些对象需要怎么注入到系统中呢?这里当然少不了配置文件的支持,现在比较流行的MVC框架大多可以使用Spring作为其IOC容器,为了简单起见,我们自己决定模拟Spring简单地实现一个配置管理容器,用于管理我们的各种对象资源。
(3)-WebApplicationContext
直接利用web.xml去配置和定义我们的对象组件显然是不灵活和不方便扩展的,由于我们系统中将会需要配置很多个不同的对象资源,比如控制器,View
对象,HandlerMapping对象等等,如何对它们进行管理,如何能让我们的前端控制器访问和利用到到它们便是我们不得不面对的问题。还好,现在有
了Spring,现在很多流行的MVC框架都支持使用Spring对自己容器里的对象资源进行管理。尽管Spring千好万好,我们这里还是决定不使用
它,而是自己来写一个对象容器来管理我们的相关资源,这样我们不仅可以了解对象资源配置管理的细节,还可以顺带学习一下Spring等IOC容器的实现原
理。当然,我们这里的实现方案将会尽可能的简单。
如下便是我们的WebApplicationContext类的实现,它能够自动查找WEB-
INF路径下所有以config结尾的xml文件,并把其中定义的对象抽取出来,放到Application作用域中,由于我们这里只是个Sample,
不需要考虑太多的并发的情况,所有对象的类型,我们都是用Singleton,也就是定义的每个对象都为所有的请求和Servlet共享。
WebApplicationContext中还定义了一个很有用的方法,beansOfType(Class<T>),该方法用于查找出系
统中定义的所有的属于当前类型的所有对象资源。
- package com.google.mvc.web.context;
- import java.io.InputStream;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import java.util.Locale;
- import java.util.Map;
- import java.util.Set;
- import java.util.concurrent.ConcurrentHashMap;
- import javax.servlet.ServletContext;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import org.apache.log4j.Logger;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.NodeList;
- public class WebApplicationContext {
- private static final Logger LOGGER = Logger.getLogger(WebApplicationContext. class );
- private static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext. class .getName() + ".CONTEXT" ;
- private Map<String, Object> cacheMap;
- private ServletContext servletContext;
- private DocumentBuilder builder;
- public WebApplicationContext(ServletContext servletContext) {
- this .servletContext = servletContext;
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- try {
- builder = factory.newDocumentBuilder();
- } catch (ParserConfigurationException e) {
- LOGGER.error("Can't load dom builder" , e);
- }
- }
- public void init() {
- ServletContext context = getServletContext();
- Set<?> set = context.getResourcePaths("/WEB-INF" );
- Object map = servletContext.getAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE);
- if (map != null ) {
- cacheMap = (Map<String, Object>) map;
- } else {
- cacheMap = new ConcurrentHashMap<String, Object>();
- servletContext.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, cacheMap);
- for (Object o : set) {
- String path = (String) o;
- if (path.endsWith( "config.xml" )) {
- try {
- loadResource(servletContext.getResourceAsStream(path));
- } catch (Exception ex) {
- LOGGER.error("Can't load resource " + path);
- }
- }
- }
- }
- }
- private void loadResource(InputStream resource) throws Exception{
- Document doc = builder.parse(resource);
- Element root = doc.getDocumentElement();
- NodeList nodeList = root.getElementsByTagName("bean" );
- for ( int i = 0 ; i < nodeList.getLength(); i++){
- Element el = (Element)nodeList.item(i);
- String id = el.getAttribute("id" );
- String className = el.getAttribute("class" );
- Class<?> clazz = this .getClass().getClassLoader().loadClass(className);
- Object o = createBean(id, clazz);
- NodeList propertyList = el.getElementsByTagName("property" );
- for ( int j = 0 ; j < propertyList.getLength(); j++){
- Element prop = (Element)propertyList.item(j);
- String methodName = getMethodName(prop.getAttribute("name" ));
- Method m = clazz.getMethod(methodName, String.class );
- String property = prop.getAttribute("value" );
- Object dependObject = cacheMap.get(property);
- if (dependObject != null ){
- m.invoke(o, dependObject);
- } else {
- m.invoke(o, property);
- }
- }
- cacheMap.put(id, o);
- }
- }
- protected String getMethodName(String methodName){
- StringBuilder sb = new StringBuilder();
- sb.append("set" );
- sb.append(methodName.substring(0 , 1 ).toUpperCase(Locale.US));
- sb.append(methodName.substring(1 ));
- return sb.toString();
- }
- public Object createBean(Class<?> clazz) throws Exception{
- return createBean(clazz.getCanonicalName(), clazz);
- }
- public Object createBean(String name, Class<?> clazz) throws Exception{
- Object o = cacheMap.get(name);
- if (o == null ){
- o = clazz.newInstance();
- if (o instanceof WebApplicationContextAware){
- ((WebApplicationContextAware)o).setWebApplicationContext(this );
- }
- cacheMap.put(name, o);
- }
- LOGGER.info(name + "=" + clazz.getCanonicalName());
- return o;
- }
- public Object getBean(String beanName){
- return servletContext.getAttribute(beanName);
- }
- public ServletContext getServletContext() {
- return servletContext;
- }
- public void setServletContext(ServletContext servletContext) {
- this .servletContext = servletContext;
- }
- public <T> Map<String, T> beansOfType(Class<T> clazz){
- Map<String, T> map = new HashMap<String, T>();
- for (String key : cacheMap.keySet()){
- Object o = cacheMap.get(key);
- if (clazz.isAssignableFrom(o.getClass())){
- map.put(key, (T)o);
- }
- }
- return map;
- }
- }
package com.google.mvc.web.context;import java.io.InputStream;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Locale;import java.util.Map;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;import javax.servlet.ServletContext;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.apache.log4j.Logger;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class WebApplicationContext {private static final Logger LOGGER = Logger.getLogger(WebApplicationContext.class);private static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".CONTEXT";private Map<String, Object> cacheMap;private ServletContext servletContext;private DocumentBuilder builder;public WebApplicationContext(ServletContext servletContext) {this.servletContext = servletContext;DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();try {builder = factory.newDocumentBuilder();} catch (ParserConfigurationException e) {LOGGER.error("Can't load dom builder", e);}}public void init() {ServletContext context = getServletContext();Set<?> set = context.getResourcePaths("/WEB-INF");Object map = servletContext.getAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE);if (map != null) {cacheMap = (Map<String, Object>) map;} else {cacheMap = new ConcurrentHashMap<String, Object>();servletContext.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, cacheMap);for (Object o : set) {String path = (String) o;if (path.endsWith("config.xml")) {try {loadResource(servletContext.getResourceAsStream(path));} catch (Exception ex) {LOGGER.error("Can't load resource " + path);}}}}}private void loadResource(InputStream resource) throws Exception{Document doc = builder.parse(resource);Element root = doc.getDocumentElement();NodeList nodeList = root.getElementsByTagName("bean");for(int i = 0; i < nodeList.getLength(); i++){Element el = (Element)nodeList.item(i);String id = el.getAttribute("id");String className = el.getAttribute("class");Class<?> clazz = this.getClass().getClassLoader().loadClass(className);Object o = createBean(id, clazz);NodeList propertyList = el.getElementsByTagName("property");for(int j = 0; j < propertyList.getLength(); j++){Element prop = (Element)propertyList.item(j);String methodName = getMethodName(prop.getAttribute("name"));Method m = clazz.getMethod(methodName, String.class);String property = prop.getAttribute("value");Object dependObject = cacheMap.get(property);if(dependObject != null){m.invoke(o, dependObject);} else {m.invoke(o, property);}}cacheMap.put(id, o);}}protected String getMethodName(String methodName){StringBuilder sb = new StringBuilder();sb.append("set");sb.append(methodName.substring(0, 1).toUpperCase(Locale.US));sb.append(methodName.substring(1));return sb.toString();}public Object createBean(Class<?> clazz) throws Exception{return createBean(clazz.getCanonicalName(), clazz);}public Object createBean(String name, Class<?> clazz) throws Exception{Object o = cacheMap.get(name);if(o == null){o = clazz.newInstance();if(o instanceof WebApplicationContextAware){((WebApplicationContextAware)o).setWebApplicationContext(this);}cacheMap.put(name, o);}LOGGER.info(name + "=" + clazz.getCanonicalName());return o;}public Object getBean(String beanName){return servletContext.getAttribute(beanName);}public ServletContext getServletContext() {return servletContext;}public void setServletContext(ServletContext servletContext) {this.servletContext = servletContext;}public <T> Map<String, T> beansOfType(Class<T> clazz){Map<String, T> map = new HashMap<String, T>();for(String key : cacheMap.keySet()){Object o = cacheMap.get(key);if(clazz.isAssignableFrom(o.getClass())){map.put(key, (T)o);}}return map;}} 我们再来看一下*.config.xml文件里对象资源的定义示例:
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < beans >
- < bean id = "ControllerAdapter" class = "com.google.mvc.web.servlet.mvc.ControllerHandlerAdapter" />
- < bean id = "HttpRequestAdapter" class = "com.google.mvc.web.servlet.mvc.HttpRequestHandlerAdapter" />
- < bean id = "ViewResolver" class = "com.google.mvc.web.servlet.mvc.DefaultViewResolver" >
- < property name = "viewClass" value = "com.google.mvc.web.servlet.mvc.InternalResourceView" />
- < property name = "prefix" value = "/WEB-INF/" />
- < property name = "suffix" value = ".jsp" />
- </ bean >
- < bean id = "login.do" class = "com.google.mvc.web.sample.LoginController" />
- < bean id = "hello.do" class = "com.google.mvc.web.sample.HelloController" />
- < bean id = "404" class = "com.google.mvc.web.servlet.mvc.HandlerFor404" />
- </ beans >
<?xml version="1.0" encoding="UTF-8"?><beans> <bean id="ControllerAdapter" class="com.google.mvc.web.servlet.mvc.ControllerHandlerAdapter" /> <bean id="HttpRequestAdapter" class="com.google.mvc.web.servlet.mvc.HttpRequestHandlerAdapter" /> <bean id="ViewResolver" class="com.google.mvc.web.servlet.mvc.DefaultViewResolver"> <property name="viewClass" value="com.google.mvc.web.servlet.mvc.InternalResourceView"/> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="login.do" class="com.google.mvc.web.sample.LoginController" /><bean id="hello.do" class="com.google.mvc.web.sample.HelloController" /> <bean id="404" class="com.google.mvc.web.servlet.mvc.HandlerFor404" /> </beans> 如果哪个对象资源需要在运行过程中使用到WebApplicationContext的资源及方法,只需实现接口 WebApplicationContextAware即可,一旦实现了该接口,当前的WebApplicationContext会被自动的注入到此对 象资源中。
- package com.google.mvc.web.context;
- public interface WebApplicationContextAware {
- void setWebApplicationContext(WebApplicationContext wac);
-
}
(4)-前端控制器
前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生 成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现。这里我们就采用后一 种方式来实现我们的MVC框架。
1.配置web.xml,使得我们的前端控制器可以拦截所有符合要求的用户请求,这里我们的前端控制器能处理所有以.do结尾的用户请求。
- <? xml version = "1.0" encoding = "ISO-8859-1" ?>
- < web-app xmlns = "http://java.sun.com/xml/ns/javaee"
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version = "2.5" >
- < description > MVC Sample </ description >
- < display-name > MVC </ display-name >
- < servlet >
- < servlet-name > DispatcherServlet </ servlet-name >
- < servlet-class > com.google.mvc.web.servlet.DispatcherServlet </ servlet-class >
- </ servlet >
- < servlet-mapping >
- < servlet-name > DispatcherServlet </ servlet-name >
发表评论
-
hibernate Restrictions用法 MatchMode.ANYWHERE
2012-07-14 15:50 3970方法 说明 Res ... -
URLClassLoader
2012-05-27 19:45 999This example shows how a serv ... -
MyClassLoader 自定义类加载器
2012-05-27 19:38 1525package demo; import java. ... -
Deal with big-endian and little-endian order
2011-12-25 19:17 1120Java virtual machine always use ... -
修改eclipse的背景色
2011-11-12 19:23 1115eclipse 操作界面默认颜色为白色。对于我们长期 ... -
多线程管道流输入输出模式
2011-11-07 07:23 1091import java.io.* ; class Send ... -
Java计数单字节双字节字符个数的例子
2011-10-26 14:29 1294/* 计数单双字符的个数并存储在Map对象中 ... -
常用内存数据库3
2011-10-24 00:24 15204.1.2 哪些场合适合使用其他的关系型数据库管 ... -
java字节码规则
2011-09-05 13:56 1254栈和局部变量操作 将常量压入栈的指令 aconst_nul ... -
Tomcat中限制ip访问
2011-08-23 21:40 1273Tomcat中限制ip访问是非常简单的,只需要编辑server ... -
一个Java程序员应该掌握的10项技能
2011-08-22 10:27 6211、语法:必须比较熟 ... -
2011 年 8 月 Java 开发人员新闻快讯
2011-08-18 18:59 837Java SE 7 发布了! 经过世界各地 Ja ... -
BlockingQueue
2011-08-13 09:59 719import java.util.concurrent.Arr ... -
eclipse中java项目转换为web项目
2011-07-27 18:29 898经常在eclipse中导入web项目时,出现转不了项目类型 ... -
Oracle官方Weblogic插件安装
2011-07-20 22:00 2881Installing Oracle Enterprise Pa ... -
Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
2011-06-21 17:44 2322C ollections类中提供了多 ... -
关于java的集合类,以及HashMap中Set的用法
2011-06-21 17:35 1807import java.util.*; public c ... -
Java的动态代理实例
2011-06-16 03:44 1058首先写一个接口: package net.test.dyna ... -
Java如何调用可执行文件和批处理命令
2011-06-07 00:58 2351Java是种跨平台的语言,我们经常碰到需要通过Java调用wi ... -
jsp实现图片验证码的方法
2011-06-07 00:57 1393调用方法 <img src=&quo ...
相关推荐
1. **MVC架构**:MVC模式是一种软件设计模式,主要应用于Web应用开发。Model负责处理数据,View负责显示数据,Controller接收用户输入并调用Model和View进行处理。这种模式提高了代码的可维护性和可测试性。 2. **...
**MVC模式详解** ...通过深入研究这个“MVC经典后台管理系统源码-经典必看”的压缩包,开发者不仅可以掌握MVC模式的实际应用,还能提升对后台管理系统设计和实现的理解,为后续的项目开发积累宝贵经验。
【ASP.NET三层架构】 ASP.NET三层架构是一种常见的软件开发模式,用于构建可扩展、易于维护的Web应用程序。...同时,源代码的提供使得学习者有机会深入探究每个层次的实现细节,进一步提升自己的编程技能。
1. 如何在PHP中实现MVC架构。 2. 如何设计和操作简单的数据库模型。 3. 使用PHP处理HTTP请求并渲染视图。 4. 数据排序的实现方式,包括服务器端和客户端策略。 5. 如何组织和结构化代码以保持良好的可读性和可维护性...
学习Backbone.js,开发者需要理解MVC架构的原理,掌握事件驱动编程和数据绑定的概念。同时,对JavaScript原型链、闭包以及异步操作的理解也是必不可少的。通过阅读源码和API文档,开发者可以学习到如何有效地组织...
Spring MVC 提供了一个灵活的架构,支持多种视图技术,如 JSP、FreeMarker 和 Velocity。 4. **AOP(面向切面编程)**:Spring 的 AOP 模块提供了面向切面编程的实现,允许开发者定义方法拦截器和切入点,以实现如...
关于Spring Boot 2021年源码的深入剖析,开源架构源码的探究是一个不断演进的领域。Spring Boot 2021继续秉承简化Spring开发的宗旨,采用了更加现代化和高效的方式来实现自动配置和应用启动流程。Spring Boot 2.0...
Struts 2是基于Apache Jakarta Struts 1的下一代框架,它融合了WebWork的核心功能,提供了更强大的MVC架构。该框架的关键组件包括Action、Result、Interceptor、ValueStack和Freemarker模板等。Action是业务逻辑的...
同时,结合JDK库的使用,可以深入探究Spring如何利用Java的特性来实现其强大的功能。 总的来说,这个压缩包为学习Spring源码提供了一套完整的资源。从IoC到AOP,从数据访问到Web开发,通过调试代码和实例,我们可以...
1. 架构设计:了解整体架构,包括MVC(模型-视图-控制器)模式的应用,以及各模块间的交互。 2. 数据库设计:查看数据库表结构,理解如何存储和管理菜单、订单、用户信息等数据。 3. API接口:研究与第三方支付平台...
2. **MVC架构**:虽然未明确提及,但现代ASP.NET项目通常会使用MVC(Model-View-Controller)架构,以提高代码的可维护性和可测试性。通过源码,你可以理解MVC模式如何应用于论坛设计。 3. **数据库交互**:论坛...
你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...
它提供了模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据展示和用户交互分离开来。Spring MVC的关键组件包括DispatcherServlet、Controller、Model、View和ViewResolver等。DispatcherServlet作为入口点,...
这部分可能涉及ASP.NET MVC中的模型(Model)、视图(View)和控制器(Controller)架构,用于处理数据输入和显示。 3. **学生需求发布**:学生可以发布寻找家教的需求,包括科目、时间、地点等。这可能通过表单...
在这个文档和源码集合中,我们可以深入探究Spring 2.0的核心概念和技术细节。 首先,`.chm`文件是Windows的帮助文件格式,这里包含的是Spring 2.0的官方文档。文档通常会详细介绍框架的架构、配置、API以及如何在...
【苹果在线源码】是一个与iOS开发相关的主题,特别是针对iPhoneQQ应用的源代码分析。在iOS开发领域,源码的分析和...同时,这也是一个很好的机会去探究大型项目如何组织架构,以及在实际场景下如何解决各种复杂问题。
本文通过源码分析,探究zabbix web应用的整体架构,所有分析基于zabbix 3.0.10进行。 总体而言,zabbix web应用使用PHP开发,大量应用OOP方法,主要采用mvc架构,同时包含一套遵循JSON-RPC 2.0协议的web API。 由于...
2. **MVC架构**:Airmail遵循Model-View-Controller(MVC)设计模式,这是一种常见的软件架构,用于组织代码并分离业务逻辑、用户界面和数据。我们将研究源码中的控制器、模型和视图如何协作,以及如何通过MVC实现...
3. **MVC(Model-View-Controller)架构**: 常见于Web应用开发,用于分离业务逻辑、数据模型和用户界面。在这个系统中,Model处理数据,View展示信息,Controller协调Model和View的交互。 4. **Servlet**: 虽然未...