为什么我再也不使用前端mvc框架架了

SpringMVC 源代码深度解析BeanWrapper及其实现
一、&BeanWrapper
BeanWrapper是对Bean的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器,由于BeanWrapper接口是PropertyAccessor的子接口,因此其也可以设置以及访问被包装对象的属性值。BeanWrapper大部分情况下是在spring ioc内部进行使用,通过BeanWrapper,spring ioc容器可以用统一的方式来访问bean的属性。用户很少需要直接使用BeanWrapper进行编程。
二、&BeanWrapperImpl
BeanWrapperImpl类是对BeanWrapper接口的默认实现,它包装了一个bean对象,缓存了bean的内省结果,并可以访问bean的属性、设置bean的属性值。BeanWrapperImpl类提供了许多默认属性编辑器,支持多种不同类型的类型转换,可以将数组、集合类型的属性转换成指定特殊类型的数组或集合。用户也可以注册自定义的属性编辑器在BeanWrapperImpl中。
三、&BeanWrapper类图
四、&BeanWrapperImpl设置所包装的bean属性值序列图
五、&BeanWrapperImpl构造方法源码分析
5.1 & & BeanWrapperImpl构造方法
BeanWrapperImpl类有多个重载方法,下面的构造方法传入一个Object对象,此对象就是被BeanWrapperImpl类所包装的bean
[java]&view
plaincopyprint?
public&BeanWrapperImpl(Object&object)&{&&
&&&&&&&registerDefaultEditors();&&
&&&&&&&setWrappedInstance(object);&&
构造方法的实现很简单,第一步在registerDefaultEditors()方法内部设置属性defaultEditorsActive值为true
第二步则调用setWrappedInstance(object)方法,进行初始化以及设置被包装的对象
5.2 & &setWrappedInstance(object)方法
此方法内部对BeanWrapperImpl类的一些重要属性进行了初始化,并创建了TypeConverterDelegate类的实例作为类型转换处理对象。在此之后,将对被包装bean进行内省分析,内省分析结果保存在cachedIntrospectionResults属性中,此属性是CachedIntrospectionResults类的实例.
5.3&&&&CachedIntrospectionResults类
CachedIntrospectionResults类用于对对象的Class进行内省分析,保存对象的PropertyDescriptor信息,其静态方法
static&CachedIntrospectionResults forClass(Class&beanClass)
&throws&BeansException
在BeanWrapperImpl类中被调用,用于对BeanWrapperImpl类所包装的bean进行内省分析,并返回内省分析结果给BeanWrapperImpl
六、&BeanWrapperImpl设置属性值源码分析
6.1&&&&&&&&&&&&&&&&&&&setPropertyValue(PropertyValue pv)方法
BeanWrapperImpl类有多个设置bean属性值的重载方法,此处以
public&void&setPropertyValue(PropertyValue pv)
throws&BeansException
方法作为说明。
[java]&view
plaincopyprint?
public&void&setPropertyValue(PropertyValue&pv)&throws&BeansException&{&&
&&&&&&&PropertyTokenHolder&tokens&=&(PropertyTokenHolder)&pv.resolvedT&&
&&&&&&&if&(tokens&==&null)&{&&
&&&&&&&&&&&……………..&&
&&&&&&&&&&&&BeanWrapperImpl&nestedBw&=&null;&&
&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&//根据属性名获取BeanWrapImpl对象,支持多重属性的递归分析处理&&
&&&&&&&&&&&&&&nestedBw&=&getBeanWrapperForPropertyPath(propertyName);&&
&&&&&&&&&&&}&&
&&&&&&&&&&&catch&………..&&
&&&&&&&&&&&tokens&=&getPropertyNameTokens(getFinalPath(nestedBw,&propertyName));&&
&&&&&&&&&&&//如果nestedBw等于this,则设置resolvedTokens属性值为tokens&&
&&&&&&&&&&&if&(nestedBw&==&this)&{&&
&&&&&&&&&&&&&&pv.getOriginalPropertyValue().resolvedTokens&=&&&
&&&&&&&&&&&}&&
&&&&&&&&&&&nestedBw.setPropertyValue(tokens,&pv);&&
&&&&&&&}&&
&&&&&&&else&{&&
&&&&&&&&&&&setPropertyValue(tokens,&pv);&&
&&&&&&&}&&
上述方法根据tokens变量是否为null,有两个不同的分支。其中当tokens为null时,则会对属性名进行递归调用分析处理,返回分析处理后的BeanWrapImpl对象nestedBw。如果nestedBw==this,则会设置pv的resolvedTokens属性值,最后将调用nestedBw对象的设置属性值方法设置属性
6.2&&&&&&&&&&&&&&&&&&&getBeanWrapperForPropertyPath方法
getBeanWrapperForPropertyPath方法用于对属性名称(包括多重属性)进行处理,并返回BeanWrapperImpl对象。所支持的属性名称包括:多重属性(以.分隔)、数组集合map
key属性(以[]方式)。
[java]&view
plaincopyprint?
protected&BeanWrapperImpl&getBeanWrapperForPropertyPath(String&propertyPath)&{&&
&&&&&&&//根据属性路径获取其第一个属性分隔符.的下标&&
&&&&&&&int&pos&=&PropertyAccessorUtils.getFirstNestedPropertySeparatorIndex(propertyPath);&&
&&&&&&&//如果找到,则表示是有多重属性递归处理&&
&&&&&&&//&Handle&nested&properties&recursively.&&
&&&&&&&if&(pos&&&-1)&{&&
&&&&&&&&&&&//获取第一个属性分隔符前面的属性名称&&
&&&&&&&&&&&String&nestedProperty&=&propertyPath.substring(0,&pos);&&
&&&&&&&&&&&//获取第一个属性分隔符后面的字符串&&
&&&&&&&&&&&String&nestedPath&=&propertyPath.substring(pos&+&1);&&
&&&&&&&&&&&//获取第一个属性片断的BeanWrapperImpl对象nestedBw&&
&&&&&&&&&&&BeanWrapperImpl&nestedBw&=&getNestedBeanWrapper(nestedProperty);&&
&&&&&&&&&&&//调用nestedBw的getBeanWrapperForPropertyPath方法,对第一个属性分隔符后面的属性字符串进行处理&&
&&&&&&&&&&&return&nestedBw.getBeanWrapperForPropertyPath(nestedPath);&&
&&&&&&&}&&
&&&&&&&//否则,返回this对象本身&&
&&&&&&&else&{&&
&&&&&&&&&&&return&this;&&
&&&&&&&}&&
在此方法中对嵌套类型的属性进行了分析,首先将处理第一个.前的属性,获取nestedBw对象。然后再调用nestedBw对象的此方法递归处理第一个.后的其它属性,并返回处理结果。
&&&&&&&getNestedBeanWrapper(nestedProperty)方法则根据nestedProperty获取嵌套的BeanWrapperImpl对象。
6.3&&&&&&&&&&&&&&&&&&&getPropertyNameTokens方法
getPropertyNameTokens方法内部用于对属性名全路径中最后一个.后的属性名称分析,返回PropertyTokenHolder对象。
6.4&&&&&&&&&&&&&&&&&&&setPropertyValue(tokens, pv)方法
最终的设置属性的操作在此方法内部进行实现,此方法将最原始的属性值经过数组、集合类型属性的处理和类型转换后得到转换后值convertedValue,并从内省信息中获取操作此属性的方法writeMethod,用反射调用writeMethod将参数值convertedValue写入至被包装对象的目标属性中。至此BeanWrapperImpl的对象设值操作处理完成。
七、&BeanWrapperImpl对嵌套属性的支持
BeanWrapperImpl类通过其成员属性提供了一种支持嵌套属性的数据结构,下面是BeanWrapperImpl类的成员:
属性类型及名称
Object object
被BeanWrapper包装的对象
String nestedPath
当前BeanWrapper对象所属嵌套层次的属性名,最顶层的BeanWrapper此属性的值为空
Object rootObject
最顶层BeanWrapper所包装的对象
Map nestedBeanWrappers
缓存当前BeanWrapper的下一层属性的nestedPath和对应的BeanWrapperImpl对象,此BeanWrapperImpl所包装的对应是属性nestedPath的值
例如有类:
Class Employee
&&&&get/set方法
Class Company
&&&&&&&&String companyN
&&&&&&&&Map&String,String&
get/set方法
Class Card
&&&&&&&&&………….
嵌套属性:pany.attrs[“location”]
最顶层的BeanWrapper是employeeBeanWrapper,其包装的对象是employeeObj,nestedPath为空,rootObject也是employObj,
employeeBeanWrapper里的nestedBeanWrappers则将包含以下的键值对:
“company”---àcompanyBeanWrapper
“card” ---àcardBeanWrapper
对于对象companyBeanWrapper,则其包装的对象则是companyObj,其nestedPath的值为company,rootObject为employeeObj,&nestedBeanWrappers里面的值为空。
BeanWrapperImpl在调用方法
protected&BeanWrapperImpl getBeanWrapperForPropertyPath(String propertyPath)
分析pany.attrs[“location”]属性值时,将先处理第一个点之前的属性employee得到顶层的BeanWrapper
nestedBw,再调用nestedBw. getBeanWrapperForPropertyPath()方法递归处理第一个点后的其它属性,并最终返回所有属性段都分析后所产生的BeanWrapperImpl对象。
属性类型及名称
String&canonicalName
canonicalName为actualName再加上[key1][key2][key3]..这种形式
保存当前级别属性的实际名称,为[前的字符串
如属性pany.attrs[“location”]
在EmployeeBeanWrapperImpl类代表company属性,则canonicalName值为”company”
如在CompanyBeanWrapperImpl类代表attrs中key为location的属性,则其canonicalName为attrs[“location”]
String&actualName
保存当前级别属性的实际名称,为[前的字符串
如属性pany.attrs[“location”]
在EmployeeBeanWrapperImpl类代表company属性,则actualName值为”company”
如在CompanyBeanWrapperImpl类代表attrs中key为location的属性,则其actualName为”attrs”,取当前属性级别中”[“前面的字符串
String[]&keys
代表当前级别属性中所有位于[与]间的key或索引所组成的数组
注:“当前级别属性”表示所要访问在属性在属性全路径中位于..之间的值
九、&所使用到的工具类
在此过程中所使用到的一些工具类和主要方法如下:
org.springframework.beans.PropertyAccessorUtils&&用于分析属性名称的工具类,提供分析嵌套属性、集合属性(包括.[]等)的一些工具方法。
出自于http://blog.csdn.net/zhiweianran/article/details/7919129
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
本文转自:/kf/920.html
我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比较经常用XML配置,控制层依赖的service比较经常用注解等(在部署时比较不会改变的),,@Con ...
我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比较经常用XML配置,控制层依赖的service比较经常用注解等(在部署时比较不会改变的),,@Controller标注web控制器,@Service标注Servicec层的服务,@Re ...
SpringMVC最核心的IOC的控制反转,动态的向某个对象提供它所需要的其他对象,例如:对象A时,需要对象B时,这时不像以前我们之前要在A对象里实例化B对象,这时B对象的实例化由IOC容器会主动创建一个对象B然后注入到对象A里,提供使用.我们项目开发中,最经常用到,那怎么实现实例Bean并依赖注入呢?我们今天带着这些问题来通过SpringMVC源代码 ...
SpringMVC通过一个配置文件描述Bean以及Bean之间的依赖关系,利用java的反射机制实例化Bean并建立Bean之间的依赖关系.IOC容器在完成这些底层工作的基础还提供了Bean的实例缓.生命周期.Bean实例代理等.BeanFacory是SpringMVC框架最核心的接口,他提供了最高级IOC的配置机制.ApplicationCon ...
SpringMVC作为一个MVC框架,有控制层,当我们在浏览器发出了一个请求,SpringMVC是怎么处理请求,而且通过请求找到对应的类的方法?我们今天带着这么问题来解析SpringMVC源代码处理过程.
我们在实现SpringMVC控制层时,标示了请求路径,并标示请求地址对应的哪个方法,源代码如下:@Controller @RequestMap ...
源码深度解析SpringMvc请求运行机制 本文依赖的是springmvc4.0.5.RELEASE,通过源码深度解析了解springMvc的请求运行机制.通过源码我们可以知道从客户端发送一个URL请求给springMvc开始,到返回数据给客户端期间是怎么运转的. 1.用户请求处理过程: 1.用户发送请求时会先从DispathcherServler的do ...
SQL注入原理深度解析 对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射.命令注射以及新近才出现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解. 一.注射式攻击的原理 注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明.这使得攻击者有机会将程序命令当作用户输入的数 ...
本人计算机专业出身,目前在一家公司做技术负责人.从事技术工作已经十几年了,然而笔者一向都没有写日志的习惯,一方面是因为处于不断的忙碌之中没有太多时间也没有这个意识,另一方总感觉自己接触的技术比较简单,没有分享的冲动.
不过十几年来一直有个心愿,想把自己在这十多年的技术经历及所见所感付诸笔端,也算是对自己的一份总结,即使哪一天再也不从事具体的开发工作了 ...Maven搭建springMVC+spring+hibernate环境
发布时间: 18:39:51
这次不再使用struts2做控制器,采用spring自己的springMVC框架实现。
首先,改写pom.xml文件,不需要struts2的相关jar了。
&project xmlns="http://maven..org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.sgl&/groupId&
&artifactId&MSSH&/artifactId&
&packaging&war&/packaging&
&version&0.0.1-SNAPSHOT&/version&
&name&MSSH Maven Webapp&/name&
&url&http://maven.apache.org&/url&
&properties&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&/properties&
&dependencies&
&!-- log4j --&
&dependency&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&version&1.2.17&/version&
&/dependency&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&4.11&/version&
&/dependency&
&!-- servlet API --&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&javax.servlet-api&/artifactId&
&version&3.1-b09&/version&
&scope&provided&/scope&
&/dependency&
&!-- MySQL驱动 --&
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.24&/version&
&/dependency&
&!-- mchange C3P0 数据源 --&
&dependency&
&groupId&com.mchange&/groupId&
&artifactId&c3p0&/artifactId&
&version&0.9.5-pre2&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-beans&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-expression&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-orm&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&3.2.2.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.codehaus.jackson&/groupId&
&artifactId&jackson-mapper-asl&/artifactId&
&version&1.9.12&/version&
&/dependency&
&!-- hibernate --&
&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate-core&/artifactId&
&version&4.2.0.Final&/version&
&/dependency&
&/dependencies&
&!-- Maven插件 --&
&artifactId&maven-war-plugin&/artifactId&
&artifactId&maven-compiler-plugin&/artifactId&
&configuration&
&source&1.6&/source&
&target&1.6&/target&
&encoding&utf-8&/encoding&
&/configuration&
&artifactId&maven-resources-plugin&/artifactId&
&configuration&
&encoding&utf-8&/encoding&
&/configuration&
&artifactId&maven-javadoc-plugin&/artifactId&
&configuration&
&encoding&utf-8&/encoding&
&/configuration&
&artifactId&maven-surefire-plugin&/artifactId&
&version&2.7.2&/version&
&configuration&
&forkMode&once&/forkMode&
&argLine&-Dfile.encoding=UTF-8&/argLine&
&/configuration&
&/plugins&
&/project&
删除struts.xml,新建spring-mvc.xml.
spring-mvc.xml
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"&
&!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 --&
&context:component-scan base-package="com.sgl.controller" /&
&!-- 避免IE执行AJAX时,返回JSON出现下载文件 --&
&bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"&
&property name="supportedMediaTypes"&
&value&text/charset=UTF-8&/value&
&/property&
&!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --&
&bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&property name="messageConverters"&
&ref bean="mappingJacksonHttpMessageConverter" /&&!-- json转换器 --&
&/property&
&!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --&
&bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" &
&property name="prefix" value="/" /&
&property name="suffix" value=".jsp" /&
删除action包,新建controller包,建UserController.java
UserController.java
package com.sgl.
import java.util.D
import java.util.UUID;
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.servlet.ModelAndV
import com.sgl.model.U
import com.sgl.service.UserS
@Controller
public class UserController {
@Autowired
private UserService userS
@RequestMapping("/reg")
public String register(){
return "index";
@RequestMapping("/user")
public ModelAndView addUser(User user) {
ModelAndView mav=null;
user.setId(UUID.randomUUID().toString());
user.setRegtime(new Date());
userService.addUser(user);
request.setAttribute("user", user);
mav = new ModelAndView();
mav.setViewName("success");
mav.addObject("user", user);
mav.addObject("msg", "注册成功了,可以去登陆了");
} catch (Exception e) {
mav.setViewName("error");
mav.addObject("user", null);
mav.addObject("msg", "注册失败");
最后修改web.xml文件,删除其中struts2的配置,增加springMVC的配置。
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="3.0" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
http:///xml/ns/javaee/web-app_3_0.xsd"&
&display-name&&/display-name&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:spring.xml,classpath:spring-hibernate.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&filter-name&encodingFilter&/filter-name&
&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&
&init-param&
&param-name&encoding&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&encodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&!-- springMVC 配置 --&
&description&spring mvc servlet&/description&
&servlet-name&springMvc&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&description&spring mvc 配置文件&/description&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:spring-mvc.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&!-- 拦截以html为后缀的请求 --&
&servlet-mapping&
&servlet-name&springMvc&/servlet-name&
&url-pattern&*.html&/url-pattern&
&/servlet-mapping&
&session-config&
&session-timeout&10&/session-timeout&
&/session-config&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
所有的配置文件完成后,项目结构如下:
执行Maven install,没有错误,部署到服务器上,启动服务器,浏览器输入http://localhost:8080/MSSH/reg.html回车
至于为什么要是输入这个地址,请仔细查看UserController.java的@RequestMapping注解的配置,这是属于spingMVC的注解,在此不再详述其拦截-转发的过程。
点击注册,注意浏览器地址的变化:
springMVC+spring+hibernate
实现用户注册完成了。其中User的password我没有写,忘记持久到数据库了,需要的可以在User.java中加上password属性和
set/get方法。毕竟这个MSSH项目只是演示如何搭建ssh框架,不是真实的项目。
来源:/xmzzp/p/4177873.htmlMyMVC Web框架的开发模式 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 22时,
MyMVC是本人业余时间通过研究各类Web框架总结的一些个人比较喜欢的web开发模式,适合中小型应用的开发,省去了服务层,目前核心包只有58KB,大家可以测试mymvc的并发量,执行效率。 如果喜欢这样的开发方式,有好的建议可以联系我/ MyMVC视图层支持JSP、Freemarker、Velocity等视图模版。 MyMVC提供强大的持久层框架,支持JavaBean和Map方式操作、查询数据库。 MyMVC提供控制器Action的拦截功能与内置事务支持,提高数据完整性。 MYMVC提供的全注解开发模式能让你享受开发的乐趣。 MYMVC在进行报表查询的时候会是很方便的,我不需要做JavaBean,动态查询得到数据库字段。 更多优点缺点希望大家多多支持。
目前我这边基于MyMVC开发了一个CMS待完善!
你们看了给点评论嘛,期待!
代码片段(4)
1.&[代码]控制器代码&&&&
package com.wuwei.
import java.util.L
import org.marker.mvc.controller.C
import org.marker.mvc.controller.an.B
import org.marker.mvc.controller.an.N
import org.marker.mvc.controller.an.R
import org.marker.mvc.controller.an.R
import org.marker.mvc.controller.intercept.UniqueC
import org.marker.mvc.model.engine.IME;
import org.marker.mvc.model.engine.ModelE
import org.marker.mvc.view.render.RenderT
* MyMVC Demo
* 访问地址为:http://ip:端口/命名空间/方法名称.do
* @author marker
@Namespace("/test/")
@Results({//视图集
@Result(name="hello",type=RenderType.JSP,to="hello.jsp"),
@Result(name="userlist",type=RenderType.JSP,to="user.jsp"),
@Before(UniqueConnection.class)//唯一数据库连接拦截器
public class IndexController extends Controller {
private static final long serialVersionUID = -252007L;
//数据库操作引擎
private IME dao = ModelEngine.me();
//HelloMyMVC
public String index(){
put("msg", "hello MyMVC! ");
return "hello";
/** 显示用户
public String user(){
List&Object& allusers = dao.find("select * from user ");
put("users", allusers);//写入请求
return "userlist";
Demo项目&~&3MB&&&&
3.&[图片] 效果截图&&&&
4.&[图片] 效果截图&&&&
开源中国-程序员在线工具:
相关的代码(33)
5回/15513阅
45回/11781阅
65回/9294阅
3回/8551阅
6回/7492阅
4回/4540阅
3回/3712阅
3回/2949阅
5回/2860阅
21回/2694阅
试试先再发表评论。。。
2楼:dreamers 发表于
有手册 不?最好能有源码。哈哈。
3楼:marker 发表于
引用来自“yangzhiyong”的评论有手册 不?最好能有源码。哈哈。暂时没帮助文档,还没开源哈。这么做Web开发爽不?
4楼:komelio 发表于
看着用起来很方便啊
5楼:aspboy 发表于
开源大家研究一下啊
6楼:hujinhu 发表于
不错不错。。。研究研究
7楼:leon_lau 发表于
如果控制器内有几十个方法,指定返回页面那就变大头了
8楼:marker 发表于
引用来自“leon_lau”的评论如果控制器内有几十个方法,指定返回页面那就变大头了如果用公共页面名称的,可以抽出一个父类,所有控制器都可以得到父类的视图集!还是看具体情况而定!
9楼:leon_lau 发表于
引用来自“舞维天下”的评论引用来自“leon_lau”的评论如果控制器内有几十个方法,指定返回页面那就变大头了如果用公共页面名称的,可以抽出一个父类,所有控制器都可以得到父类的视图集!还是看具体情况而定!渲染页面可以加一个coc,会更简洁,不用每次都指定
10楼:闲庭风 发表于
难道需要反编译吗?我不想......
11楼:marker 发表于
引用来自“无很”的评论难道需要反编译吗?我不想......这个垃圾框架并发一高就悲剧了!
12楼:相信你自己 发表于
兄弟 最近在干嘛
13楼:marker 发表于
引用来自“梦在此刻不再遥远”的评论兄弟 最近在干嘛准备课程、接外包、做一手机商城项目,开发MRCMS,学习PhotoShop视觉设计、Axure交互设计等等。反正就是学习工作。,晓得不嘛。
14楼:相信你自己 发表于
引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论兄弟 最近在干嘛准备课程、接外包、做一手机商城项目,开发MRCMS,学习PhotoShop视觉设计、Axure交互设计等等。反正就是学习工作。,晓得不嘛。很忙哈 哈哈
15楼:marker 发表于
引用来自“梦在此刻不再遥远”的评论引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论兄弟 最近在干嘛准备课程、接外包、做一手机商城项目,开发MRCMS,学习PhotoShop视觉设计、Axure交互设计等等。反正就是学习工作。,晓得不嘛。很忙哈 哈哈也不算,呵呵。
16楼:相信你自己 发表于
引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论兄弟 最近在干嘛准备课程、接外包、做一手机商城项目,开发MRCMS,学习PhotoShop视觉设计、Axure交互设计等等。反正就是学习工作。,晓得不嘛。很忙哈 哈哈也不算,呵呵。你是老师?
17楼:marker 发表于
引用来自“梦在此刻不再遥远”的评论引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论兄弟 最近在干嘛准备课程、接外包、做一手机商城项目,开发MRCMS,学习PhotoShop视觉设计、Axure交互设计等等。反正就是学习工作。,晓得不嘛。很忙哈 哈哈也不算,呵呵。你是老师?下周开始带,我觉得我好年轻哦。
18楼:相信你自己 发表于
怕什么 &老师不是比那个是老头子。而是为人师表。
19楼:marker 发表于
引用来自“梦在此刻不再遥远”的评论怕什么 &老师不是比那个是老头子。而是为人师表。怕倒不是很怕,我之前在一个大学里面兼职3个月讲师,讲Java基础。
20楼:相信你自己 发表于
引用来自“舞维天下”的评论引用来自“梦在此刻不再遥远”的评论怕什么 &老师不是比那个是老头子。而是为人师表。怕倒不是很怕,我之前在一个大学里面兼职3个月讲师,讲Java基础。可以嘛
开源从代码分享开始
marker的其它代码}

我要回帖

更多关于 spring mvc框架搭建 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信