配色: 字号:
spring MVC
2017-03-31 | 阅:  转:  |  分享 
  
SpringMVC背景介绍Spring框架提供了构建Web?http://baike.baidu.com/view/330120.
htm应用程序的全功能MVC模块。使用Spring可插入的MVC架构,可以选择是使用内置的SpringWeb框架
还是Struts这样的Web框架。通过策略接口,Spring框架是高度可配置的,而且包含多种http://baike.b
aidu.com/view/71981.htm视图技术,例如JavaServerPages(JSP)技术、Velocity、T
iles、iText和POI。SpringMVC框架并不知道使用的视图,所以不会强迫您只使用JSP技术。Spring
MVC分离了控制器、模型http://baike.baidu.com/view/2387.htm对象、分派器以及处理程序对象的角
色,这种分离让它们更容易进行定制。常见MVC框架比较运行性能上:Jsp+servlet>struts1>springmvc>st
ruts2+freemarker>>struts2,ognl,值栈。开发效率上,基本正好相反。值得强调的是,springmvc开
发效率和struts2不相上下。Struts2的性能低的原因是因为OGNL和值栈造成的。所以,如果你的系统并发量高,可以使用fre
emaker进行显示,而不是采用OGNL和值栈。这样,在性能上会有相当大得提高。基于spring2.5的采用XML配置的sprin
gMVC项目注:本项目全部基于XML配置。同时,集成了hibernate。采用的是:springMVC+hibernate+s
pring的开发架构。建立web项目导入jar包(spring.jar,spring-webmvc.jar,commons-
logging.jar。其他jar包为hibernate相关jar包)修改web.xml如下:"encoding="UTF-8"?>.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeeht
tp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">>let-name>dispatcherServletorg.spr
ingframework.web.servlet.DispatcherServlet
-param>contextConfigLocationue>/WEB-INF/hib-config.xml,/WEB-INF/web-config.xml,/WEB-INF/servi
ce-config.xml,/WEB-INF/dao-config.xml
1
>dispatcherServlet.d
o
增加web-config.xml(这里包含
springmvc相关的相关配置)lns="http://www.springframework.org/schema/beans"xmlns:xsi="http:
//www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://
www.springframework.org/schema/beanshttp://www.springframework.o
rg/schema/beans/spring-beans-2.5.xsd">
vlet.mvc.multiaction.ParameterMethodNameResolver">="paramName"value="action"/>value="list"/>lver"class="org.springframework.web.servlet.view.InternalResourc
eViewResolver">work.web.servlet.view.JstlView"/><
!--servlet映射列表,所有控制层Controller的servlet在这里定义-->ping"class="org.springframework.web.servlet.handler.SimpleUrlHan
dlerMapping">do">userControllerserController"class="com.sxt.action.UserController">me="userService"ref="userService">在WEB
-INF下增加service-config.xml(这里包含service层类的相关配置)encoding="UTF-8"?>hema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beansh
ttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
rtyname="userDao"ref="userDao">在WEB-I
NF下增加hib-config.xml(这里包含spring集成hibernate相关的配置)"encoding="UTF-8"?>schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="
http://www.springframework.org/schema/tx"xmlns:context="http://ww
w.springframework.org/schema/context"xsi:schemaLocation="http://w
ww.springframework.org/schema/beanshttp://www.springframework.or
g/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org
/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.
xsdhttp://www.springframework.org/schema/aophttp://www.springfra
mework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframewo
rk.org/schema/contexthttp://www.springframework.org/schema/conte
xt/spring-context-2.5.xsd">com.sxt"/>aSource"class="org.apache.commons.dbcp.BasicDataSource">ertyname="driverClassName"value="com.mysql.jdbc.Driver">operty>myhib">erty>n>ernate3.annotation.AnnotationSessionFactoryBean">="dataSource">name="hibernateProperties">org.hibernate.dialect.MySQLDi
alecttruekey="hibernate.hbm2ddl.auto">update
<
propertyname="packagesToScan">com.sxt.poy>k.orm.hibernate3.HibernateTemplate">ry"ref="sessionFactory">JdbcTemplate">bean>ork.orm.hibernate3.HibernateTransactionManager">sessionFactory"ref="sessionFactory">tion-driventransaction-manager="txManager"/>ointcutexpression="execution(publiccom.sxt.service.impl..(.
.))"id="businessService"/>intcut-ref="businessService"/>
vice"transaction-manager="txManager">dname="find"read-only="true"propagation="NOT_SUPPORTED"/>--get开头的方法不需要在事务中运行。有些情况是没有必要使用事务的,比如获取数据。开启事务本身对性能是有一定的影响的-->
advice>在WEB-INF下增加dao-config.xml(这里包含dao层类的相关配置)rsion="1.0"encoding="UTF-8"?>ework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance"xsi:schemaLocation="http://www.springframework.org/sc
hema/beanshttp://www.springframework.org/schema/beans/spring-bea
ns-2.5.xsd">ertyname="hibernateTemplate"ref="hibernateTemplate">
建立相关类和包结构,如下图所示:各类代码如下:packagecom.sxt.po;import
javax.persistence.Entity;importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;importjavax.persistence.
Id;@EntitypublicclassUser{@Id@GeneratedValue(strategy=Generati
onType.AUTO)privateintid;privateStringuname;publicintgetId(
){returnid;}publicvoidsetId(intid){this.id=id;}publicStr
inggetUname(){returnuname;}publicvoidsetUname(Stringuname)
{this.uname=uname;}}packagecom.sxt.dao;importorg.springframew
ork.orm.hibernate3.HibernateTemplate;importcom.sxt.po.User;publi
cclassUserDao{privateHibernateTemplatehibernateTemplate;publ
icvoidadd(Useru){System.out.println("UserDao.add()");hibernate
Template.save(u);}publicHibernateTemplategetHibernateTemplate()
{returnhibernateTemplate;}publicvoidsetHibernateTemplate(Hibe
rnateTemplatehibernateTemplate){this.hibernateTemplate=hibern
ateTemplate;}}packagecom.sxt.service;importcom.sxt.dao.UserDao;
importcom.sxt.po.User;publicclassUserService{privateUserDao
userDao;publicvoidadd(Stringuname){System.out.println("UserSer
vice.add()");Useru=newUser();u.setUname(uname);userDao.add(u)
;}publicUserDaogetUserDao(){returnuserDao;}publicvoidsetUse
rDao(UserDaouserDao){this.userDao=userDao;}}packagecom.sxt.a
ction;importjavax.servlet.http.HttpServletRequest;importjavax.s
ervlet.http.HttpServletResponse;importorg.springframework.web.se
rvlet.ModelAndView;importorg.springframework.web.servlet.mvc.Con
troller;importcom.sxt.service.UserService;publicclassUserContr
ollerimplementsController{privateUserServiceuserService;@Ove
rridepublicModelAndViewhandleRequest(HttpServletRequestreq,Htt
pServletResponseresp)throwsException{System.out.println("Hell
oController.handleRequest()");req.setAttribute("a","aaaa");userS
ervice.add(req.getParameter("uname"));returnnewModelAndView("i
ndex");}publicUserServicegetUserService(){returnuserService;}
publicvoidsetUserService(UserServiceuserService){this.userSer
vice=userService;}}运行测试:http://locahost:8080/springmvc01/user.d
o?uname=zhangsanhttp://locahost:8080/springmvc01/user.do?uname=zh
angsan。结果:数据库中增加zhangsan的记录。页面跳转到index.jsp上,显示:基于spring2.5注解实现的sp
ringMVC项目我们采用sprngMVC开发项目时,通常都会采用注解的方式,这样可以大大提高我们的开发效率。实现零配置。下面
我们从零开始重新做一个springMVC的配置。这个项目完全采用注解的方式开发。同时,我们以后的springMVC项目也都会采
用注解的方式。建立web项目导入jar包(spring.jar,spring-webmvc.jar,commons-loggi
ng.jar。其他jar包为hibernate相关jar包)修改web.xml,文件内容如下:"encoding="UTF-8"?>.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-i
nstance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeeht
tp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">et-name>springmvcorg.springframew
ork.web.servlet.DispatcherServlet
<
param-name>contextConfigLocation/WEB-I
NF/hib-config.xml,/WEB-INF/springmvc-servlet.xml
init-param>1
let-mapping>springmvc
.do
springmvc-servlet.
xml配置内容如下:tp://www.springframework.org/schema/beans"xmlns:xsi="http://www
.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframew
ork.org/schema/p"xmlns:context="http://www.springframework.org/
schema/context"xsi:schemaLocation="http://www.springframework.or
g/schema/beanshttp://www.springframework.org/schema/beans/sprin
g-beans-2.5.xsdhttp://www.springframework.org/schema/contextht
tp://www.springframework.org/schema/context/spring-context-2.5.xs
d">nt-scanbase-package="com.sxt"/>tion.AnnotationMethodHandlerAdapter"/>ResourceViewResolver"p:suffix=".jsp"/>hib-config.xml(配置
了spring集成hibernate)mlns="http://www.springframework.org/schema/beans"xmlns:xsi="http
://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.spri
ngframework.org/schema/aop"xmlns:tx="http://www.springframework.o
rg/schema/tx"xmlns:context="http://www.springframework.org/schema
/context"xsi:schemaLocation="http://www.springframework.org/schem
a/beanshttp://www.springframework.org/schema/beans/spring-beans-
2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springf
ramework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframewor
k.org/schema/aophttp://www.springframework.org/schema/aop/spring
-aop-2.5.xsdhttp://www.springframework.org/schema/contexthttp:/
/www.springframework.org/schema/context/spring-context-2.5.xsd"><
context:component-scanbase-package="com.sxt"/><
aop:aspectj-autoproxy/>commons.dbcp.BasicDataSource">value="com.mysql.jdbc.Driver">"value="jdbc:mysql://localhost:3306/myhib">yname="username"value="root">ord"value="123456">"class="org.springframework.orm.hibernate3.annotation.Annotatio
nSessionFactoryBean">ataSource"/>
lect">org.hibernate.dialect.MySQLDialecthibernate.show_sql">true">updaten">com.sxt.poteTemplate"class="org.springframework.orm.hibernate3.HibernateTe
mplate">roperty>class="org.springframework.jdbc.core.JdbcTemplate">me="dataSource"ref="dataSource"/>d="txManager"class="org.springframework.orm.hibernate3.Hibernate
TransactionManager">Factory">ger="txManager"/>n(publiccom.sxt.service.impl..(..))"id="businessService"/>
/>
xManager">ue"propagation="NOT_SUPPORTED"/>WEB-INF下建立js
p文件夹,并且将index.jsp放入该文件夹下。Index.jsp的内容如下:<%@pagelanguage="java"
import="java.util."pageEncoding="gbk"%><%Stringpath=request.
getContextPath();StringbasePath=request.getScheme()+"://"+requ
est.getServerName()+":"+request.getServerPort()+path+"/";%>YPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><
head>">MyJSP''index.jsp''star<br>tingpagetahttp-equiv="cache-control"content="no-cache">="expires"content="0">ord1,keyword2,keyword3">hisismypage">

${params.uname}>

${requestScope.u}

${requestSco
pe.user}

建立整个项目的包结构和相关类。如下图所示:User、UserDao、Use
rService、UserController类的代码如下:packagecom.sxt.po;importjavax.per
sistence.Entity;importjavax.persistence.GeneratedValue;importja
vax.persistence.GenerationType;importjavax.persistence.Id;@Entit
ypublicclassUser{@Id@GeneratedValue(strategy=GenerationType.AU
TO)privateintid;privateStringuname;privateStringpwd;public
StringgetPwd(){returnpwd;}publicvoidsetPwd(Stringpwd){this
.pwd=pwd;}publicintgetId(){returnid;}publicvoidsetId(int
id){this.id=id;}publicStringgetUname(){returnuname;}public
voidsetUname(Stringuname){this.uname=uname;}}packagecom.sx
t.dao;importjavax.annotation.Resource;importorg.springframework
.orm.hibernate3.HibernateTemplate;importorg.springframework.ster
eotype.Repository;importcom.sxt.po.User;@Repository("userDao")pu
blicclassUserDao{@ResourceprivateHibernateTemplatehibernateT
emplate;publicvoidadd(Useru){System.out.println("UserDao.add()
");hibernateTemplate.save(u);}publicHibernateTemplategetHiberna
teTemplate(){returnhibernateTemplate;}publicvoidsetHibernateT
emplate(HibernateTemplatehibernateTemplate){this.hibernateTempl
ate=hibernateTemplate;}}packagecom.sxt.service;importjavax.an
notation.Resource;importorg.springframework.stereotype.Service;i
mportcom.sxt.dao.UserDao;importcom.sxt.po.User;@Service("userSe
rvice")publicclassUserService{@ResourceprivateUserDaouserDao
;publicvoidadd(Stringuname){System.out.println("UserService.ad
d()");Useru=newUser();u.setUname(uname);userDao.add(u);}publi
cUserDaogetUserDao(){returnuserDao;}publicvoidsetUserDao(Us
erDaouserDao){this.userDao=userDao;}}packagecom.sxt.web;impo
rtjavax.annotation.Resource;importorg.springframework.stereotyp
e.Controller;importorg.springframework.ui.ModelMap;importorg.sp
ringframework.web.bind.annotation.RequestMapping;importorg.sprin
gframework.web.bind.annotation.RequestParam;importorg.springfram
ework.web.bind.annotation.SessionAttributes;importcom.sxt.po.Use
r;importcom.sxt.service.UserService;@Controller("userController"
)@RequestMapping("/user.do")publicclassUserController{@Resour
ceprivateUserServiceuserService;@RequestMapping(params="method=
reg")publicStringreg(Stringuname){System.out.println("HelloC
ontroller.handleRequest()");userService.add(uname);return"index
";}publicUserServicegetUserService(){returnuserService;}publi
cvoidsetUserService(UserServiceuserService){this.userService
=userService;}}运行测试:http://pc-201110291327:8080/springmvc02/user
.do?method=reg&uname=gaoqi则会调用userController的reg方法,从而将数据内容插入到数据库中
。基于spring3.0项目开发实例spring3.0完全兼容spring2.5.因此,我们只要简单修改上面项目的类库和配置文件
。类的代码保持不变。导入相关jar包,如下:spring配置文件springmvc-servlet.xml修改如下:ersion="1.0"encoding="UTF-8"?>mework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSc
hema-instance"xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:co
ntext="http://www.springframework.org/schema/context"xmlns:util
="http://www.springframework.org/schema/util"xsi:schemaLocation
="http://www.springframework.org/schema/beanshttp://www.springfr
amework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springfr
amework.org/schema/contexthttp://www.springframework.org/schema/
context/spring-context-3.0.xsdhttp://www.springframework.org/sch
ema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.
xsdhttp://www.springframework.org/schema/utilhttp://www.springf
ramework.org/schema/util/spring-util-3.0.xsd">"com.sxt.web"/>ringframework.web.servlet.mvc.annotation.AnnotationMethodHandlerA
dapter"/>gframework.web.servlet.view.InternalResourceViewResolver"p:pref
ix="/WEB-INF/jsp/"p:suffix=".jsp"><
propertyname="viewClass"value="org.springframework.web.servlet.
view.JstlView"/>spring配置文件hib-config.xml内容修改如下:
ringframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"xmlns:aop="http://www.springframework.org/sch
ema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:
context="http://www.springframework.org/schema/context"xsi:schema
Location="http://www.springframework.org/schema/beanshttp://www.
springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.s
pringframework.org/schema/txhttp://www.springframework.org/schema
/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aopht
tp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp:/
/www.springframework.org/schema/contexthttp://www.springframewor
k.org/schema/context/spring-context-3.0.xsd">canbase-package="com.sxt"/>xy/>ataSource">dbc.Driver">://localhost:3306/myhib">alue="root">>gframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
">operty>org.hiberna
te.dialect.MySQLDialect>trueupdaterops>com.sxt.p
o
org.springframework.orm.hibernate3.HibernateTemplate">name="sessionFactory"ref="sessionFactory">amework.jdbc.core.JdbcTemplate">="dataSource"/>="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
><
aop:config>service.impl..(..))"id="businessService"/>-ref="txAdvice"pointcut-ref="businessService"/><
tx:adviceid="txAdvice"transaction-manager="txManager">ributes>T_SUPPORTED"/>:attributes>web.xml文件不变类的代码不变。运行,测试。跟上一个项目保
持一致。SpringMVC3.0深入核心原理用户发送请求给服务器。url:user.do服务器收到请求。发现Dispatch
Servlet可以处理。于是调用DispatchServlet。DispatchServlet内部,通过HandleMapping
检查这个url有没有对应的Controller。如果有,则调用Controller。Controller开始执行。Controll
er执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对
象本身就包含了视图对象信息。DispatchServlet将执视图对象中的数据,输出给服务器。服务器将数据输出给客户端。sprin
g3.0中相关jar包的含义org.springframework.aop-3.0.3.RELEASE.jarspring的aop
面向切面编程org.springframework.asm-3.0.3.RELEASE.jarspring独立的asm字节码生成程
序org.springframework.beans-3.0.3.RELEASE.jarIOC的基础实现org.springfra
mework.context-3.0.3.RELEASE.jarIOC基础上的扩展服务org.springframework.co
re-3.0.3.RELEASE.jarspring的核心包org.springframework.expression-3.0.
3.RELEASE.jarspring的表达式语言org.springframework.web-3.0.3.RELEASE.ja
rweb工具包org.springframework.web.servlet-3.0.3.RELEASE.jarmvc工具包@Co
ntroller控制器定义和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线
程共享。因此,我们将控制器设计成无状态类。在spring3.0中,通过@controller标注即可将class定义为一个con
troller类。为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下
定义:注:实际上,使用@c
omponent,也可以起到@Controller同样的作用。@RequestMapping在类前面定义,则将url和类绑定。在方
法前面定义,则将url和类的方法绑定,如下所示:packagecom.sxt.web;importjavax.annotati
on.Resource;importorg.springframework.stereotype.Controller;impo
rtorg.springframework.web.bind.annotation.RequestMapping;import
com.sxt.service.UserService;@Controller@RequestMapping("/user.do"
)publicclassUserController{@ResourceprivateUserServiceuserS
ervice;//http://localhost:8080/springmvc02/user.do?method=reg&una
me=zzzz@RequestMapping(params="method=reg")publicStringreg(Str
inguname){System.out.println("HelloController.handleRequest()")
;userService.add(uname);return"index";}publicUserServicegetUs
erService(){returnuserService;}publicvoidsetUserService(UserS
erviceuserService){this.userService=userService;}}@RequestPar
am一般用于将指定的请求参数付给方法中形参。示例代码如下:@RequestMapping(params="method=reg5
")publicStringreg5(@RequestParam("name")Stringuname,ModelMapm
ap){System.out.println("HelloController.handleRequest()");Syste
m.out.println(uname);return"index";}这样,就会将name参数的值付给uname。当然,如果
请求参数名称和形参名称保持一致,则不需要这种写法。@SessionAttributes将ModelMap中指定的属性放到sessi
on中。示例代码如下:@Controller@RequestMapping("/user.do")@SessionAttribut
es({"u","a"})//将ModelMap中属性名字为u、a的再放入session中。这样,request和session中
都有了。publicclassUserController{@RequestMapping(params="method=
reg4")publicStringreg4(ModelMapmap){System.out.println("Hel
loController.handleRequest()");map.addAttribute("u","uuuu");//将
u放入request作用域中,这样转发页面也可以取到这个数据。return"index";}}


${requestScope.u.uname}

${sessionScope.u.
uname}

注:名字为”user”的属性再结合使用注解@SessionAttributes可能会报错。@
ModelAttributemailto:这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap这
个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。示例代码
如下:packagecom.sxt.web;importjavax.annotation.Resource;importor
g.springframework.stereotype.Controller;importorg.springframewor
k.ui.ModelMap;importorg.springframework.web.bind.annotation.Mode
lAttribute;importorg.springframework.web.bind.annotation.Request
Mapping;importorg.springframework.web.bind.annotation.SessionAtt
ributes;@Controller@RequestMapping("/user.do")@SessionAttributes(
{"u","a"})publicclassUserController{@RequestMapping(params=
"method=reg4")publicStringreg4(ModelMapmap){System.out.printl
n("HelloController.handleRequest()");map.addAttribute("u","尚学堂高淇"
);return"index";}@RequestMapping(params="method=reg5")publicStr
ingreg5(@ModelAttribute("u")Stringuname,ModelMapmap){System.
out.println("HelloController.handleRequest()");System.out.println
(uname);return"index";}}先调用reg4方法,再调用reg5方法。我们发现控制台打印出来:尚学堂高淇Co
ntroller类中方法参数的处理Controller类中方法返回值的处理返回string(建议)根据返回值找对应的显示页面。路径
规则为:prefix前缀+返回值+suffix后缀组成代码如下:@RequestMapping(params="method=re
g4")publicStringreg4(ModelMapmap){System.out.println("HelloCo
ntroller.handleRequest()");return"index";}前缀为:/WEB-INF/jsp/后缀是:.
jsp在转发到:/WEB-INF/jsp/index.jsp也可以返回ModelMap、ModelAndView、map、List
、Set、Object、无返回值。一般建议返回字符串!请求转发和重定向代码示例:packagecom.sxt.web;impo
rtjavax.annotation.Resource;importorg.springframework.stereotyp
e.Controller;importorg.springframework.ui.ModelMap;importorg.sp
ringframework.web.bind.annotation.ModelAttribute;importorg.sprin
gframework.web.bind.annotation.RequestMapping;importorg.springfr
amework.web.bind.annotation.SessionAttributes;@Controller@Request
Mapping("/user.do")publicclassUserController{@RequestMapping(
params="method=reg4")publicStringreg4(ModelMapmap){System.out
.println("HelloController.handleRequest()");//return"forward:ind
ex.jsp";//return"forward:user.do?method=reg5";//转发//return"red
irect:user.do?method=reg5";//重定向return"redirect:http://www.bai
du.com";//重定向}@RequestMapping(params="method=reg5")publicStrin
greg5(Stringuname,ModelMapmap){System.out.println("HelloCont
roller.handleRequest()");System.out.println(uname);return"index
";}}访问reg4方法,既可以看到效果。获得request对象、session对象普通的Controller类,示例代码如下:@
Controller@RequestMapping("/user.do")publicclassUserController
{@RequestMapping(params="method=reg2")publicStringreg2(String
uname,HttpServletRequestreq,ModelMapmap){req.setAttribute("a",
"aa");req.getSession().setAttribute("b","bb");return"index";}}M
odelMap是map的实现,可以在其中存放属性,作用域同request。下面这个示例,我们可以在modelMap中放入数据,然后
在forward的页面上显示这些数据。通过el表达式、JSTL、java代码均可。代码如下:packagecom.sxt.web
;importorg.springframework.stereotype.Controller;importorg.spri
ngframework.ui.ModelMap;importorg.springframework.web.bind.annot
ation.RequestMapping;importorg.springframework.web.servlet.mvc.m
ultiaction.MultiActionController;@Controller@RequestMapping("/use
r.do")publicclassUserControllerextendsMultiActionController
{@RequestMapping(params="method=reg")publicStringreg(Stringuna
me,ModelMapmap){map.put("a","aaa");return"index";}}<%@pagela
nguage="java"import="java.util."pageEncoding="gbk"%><%@taglib
prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>TMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">

${requestScope.a}

Scope.a}">ModelAndView模型视图类见名知意,从名字上我们可以知道
ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信
息存储到了view属性。我们看一下ModelAndView的部分源码,即可知其中关系:publicclassModelAndV
iew{/ViewinstanceorviewnameString/privateObjectview;
/ModelMap/privateModelMapmodel;/Indicateswhetheror
notthisinstancehasbeenclearedwithacallto{@link#clear(
)}./privatebooleancleared=false;/Defaultconstructorf
orbean-styleusage:populatingbeanpropertiesinsteadofpass
inginconstructorarguments.@see#setView(View)@see#setVi
ewName(String)/publicModelAndView(){}/Convenientconstru
ctorwhenthereisnomodeldatatoexpose.Canalsobeusedin
conjunctionwithaddObject.@paramviewNamename
oftheViewtorender,toberesolvedbytheDispatcherServlet''
sViewResolver@see#addObject/publicModelAndView(Stringvie
wName){this.view=viewName;}/Convenientconstructorwhent
hereisnomodeldatatoexpose.Canalsobeusedinconjunctio
nwithaddObject.@paramviewViewobjecttorende
r@see#addObject/publicModelAndView(Viewview){this.view=
view;}/CreatesnewModelAndViewgivenaviewnameandamod
el.@paramviewNamenameoftheViewtorender,toberesolved
bytheDispatcherServlet''sViewResolver@parammodelMapofm
odelnames(Strings)tomodelobjects(Objects).Modelentries
maynotbenull,butthemodelMapmaybenu
ll
ifthereisnomodeldata./publicModelAndView(String
viewName,Mapmodel){this.view=viewName;if(model
!=null){getModelMap().addAllAttributes(model);}}/Createsn
ewModelAndViewgivenaViewobjectandamodel.Note
:thesuppliedmodeldataiscopiedintotheinternalstorageo
fthisclass.YoushouldnotconsidertomodifythesuppliedMa
paftersupplyingittothisclass
@paramviewView
objecttorender@parammodelMapofmodelnames(Strings)tom
odelobjects(Objects).Modelentriesmaynotbenullde>,butthemodelMapmaybenullifthereisno
modeldata./publicModelAndView(Viewview,Mapmodel
){this.view=view;if(model!=null){getModelMap().addAllAttri
butes(model);}}/Convenientconstructortotakeasinglemode
lobject.@paramviewNamenameoftheViewtorender,toberes
olvedbytheDispatcherServlet''sViewResolver@parammodelNam
enameofthesingleentryinthemodel@parammodelObjectthe
singlemodelobject/publicModelAndView(StringviewName,String
modelName,ObjectmodelObject){this.view=viewName;addObject(m
odelName,modelObject);}/Convenientconstructortotakeasi
nglemodelobject.@paramviewViewobjecttorender@paramm
odelNamenameofthesingleentryinthemodel@parammodelObje
ctthesinglemodelobject/publicModelAndView(Viewview,Strin
gmodelName,ObjectmodelObject){this.view=view;addObject(mode
lName,modelObject);}/SetaviewnameforthisModelAndView,
toberesolvedbytheDispatcherServletviaaViewResolver.Wi
lloverrideanypre-existingviewnameorView./publicvoids
etViewName(StringviewName){this.view=viewName;}/Returnt
heviewnametoberesolvedbytheDispatcherServletviaaView
Resolver,ornullifweareusingaViewobject./p
ublicStringgetViewName(){return(this.viewinstanceofString?
(String)this.view:null);}/SetaViewobjectforthisMod
elAndView.Willoverrideanypre-existingviewnameorView./
publicvoidsetView(Viewview){this.view=view;}/Returnth
eViewobject,ornullifweareusingaviewname
toberesolvedbytheDispatcherServletviaaViewResolver./pu
blicViewgetView(){return(this.viewinstanceofView?(View)t
his.view:null);}/IndicatewhetherornotthisModelA
ndView
hasaview,eitherasaviewnameorasadirect
{@linkView}instance./publicbooleanhasView(){return(this.v
iew!=null);}/Returnwhetherweuseaviewreference,i.e.
trueiftheviewhasbeenspecifiedviaanameto
beresolvedbytheDispatcherServletviaaViewResolver./publ
icbooleanisReference(){return(this.viewinstanceofString);}/
Returnthemodelmap.Mayreturnnull.Called
byDispatcherServletforevaluationofthemodel./protectedMa
pgetModelInternal(){returnthis.model;}/Re
turntheunderlyingModelMapinstance(nevern
ull
)./publicModelMapgetModelMap(){if(this.model==n
ull){this.model=newModelMap();}returnthis.model;}/Retur
nthemodelmap.Neverreturnsnull.Tobecalled
byapplicationcodeformodifyingthemodel./publicMapObject>getModel(){returngetModelMap();}/Addanattribute
tothemodel.@paramattributeNamenameoftheobjecttoaddt
othemodel@paramattributeValueobjecttoaddtothemodel(n
evernull)@seeModelMap#addAttribute(String,Obje
ct)@see#getModelMap()/publicModelAndViewaddObject(String
attributeName,ObjectattributeValue){getModelMap().addAttribute
(attributeName,attributeValue);returnthis;}/Addanattribu
tetothemodelusingparameternamegeneration.@paramattribu
teValuetheobjecttoaddtothemodel(nevernull)
@seeModelMap#addAttribute(Object)@see#getModelMap()/publ
icModelAndViewaddObject(ObjectattributeValue){getModelMap().a
ddAttribute(attributeValue);returnthis;}/Addallattributes
containedintheprovidedMaptothemodel.@parammodelMapa
MapofattributeName->attributeValuepairs@seeModelMap#addA
llAttributes(Map)@see#getModelMap()/publicModelAndViewadd
AllObjects(MapmodelMap){getModelMap().addAllAttribut
es(modelMap);returnthis;}/ClearthestateofthisModelAndV
iewobject.Theobjectwillbeemptyafterwards.

Canbeus
edtosuppressrenderingofagivenModelAndViewobjectinthe
postHandlemethodofaHandlerInterceptor.@see#i
sEmpty()@seeHandlerInterceptor#postHandle/publicvoidclear
(){this.view=null;this.model=null;this.cleared=true;}/
ReturnwhetherthisModelAndViewobjectisempty,i.e.whether
itdoesnotholdanyviewanddoesnotcontainamodel./public
booleanisEmpty(){return(this.view==null&&CollectionUtils.
isEmpty(this.model));}/ReturnwhetherthisModelAndViewobje
ctisemptyasaresultofacallto{@link#clear}i.e.whethe
ritdoesnotholdanyviewanddoesnotcontainamodel.

Re
turnsfalseifanyadditionalstatewasaddedtothe
instanceafterthecallto{@link#clear}.
@see#clear()/publicbooleanwasCleared(){return(this.cleared
&&isEmpty());}/Returndiagnosticinformationaboutthismo
delandview./@OverridepublicStringtoString(){StringBuilder
sb=newStringBuilder("ModelAndView:");if(isReference()){sb.a
ppend("referencetoviewwithname''").append(this.view).append("
''");}else{sb.append("materializedViewis[").append(this.view).
append('']'');}sb.append(";modelis").append(this.model);returns
b.toString();}}测试代码如下:packagecom.sxt.web;importorg.springframew
ork.stereotype.Controller;importorg.springframework.web.bind.ann
otation.RequestMapping;importorg.springframework.web.servlet.Mod
elAndView;importorg.springframework.web.servlet.mvc.multiaction.
MultiActionController;importcom.sxt.po.User;@Controller@RequestM
apping("/user.do")publicclassUserControllerextendsMultiAction
Controller{@RequestMapping(params="method=reg")publicModelAndV
iewreg(Stringuname){ModelAndViewmv=newModelAndView();mv.set
ViewName("index");//mv.setView(newRedirectView("index"));Useru
=newUser();u.setUname("高淇");mv.addObject(u);//查看源代码,得知,直接放入对象。
属性名为”首字母小写的类名”。一般建议手动增加属性名称。mv.addObject("a","aaaa");returnmv;
}}<%@pagelanguage="java"import="java.util."pageEncoding="gbk
"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"
%>

${requestScope.a}

${req
uestScope.user.uname}

地址栏输入:http://localhost:8
080/springmvc03/user.do?method=reghttp://localhost:8080/springmvc
03/user.do?method=reg结果为:基于spring3.0mvc框架的文件上传实现1.spring使用了apa
che-commons下得上传组件,因此,我们需要引入两个jar包:apache-commons-fileupload.jarap
ache-commons-io.jar2.在springmvc-servlet.xml配置文件中,增加CommonsMulti
partResoler配置:"org.springframework.web.multipart.commons.CommonsMultipartResolv
er">
pload/"/>
3.建立upload.jsp页面,内容如下:<%@pagelanguage="java"im
port="java.util."pageEncoding="gbk"%>W3C//DTDHTML4.01Transitional//EN">测试springm<br>vc中上传的实现t"enctype="multipart/form-data">><
/body>4.建立控制器,代码如下:packagecom.sxt.web;importjava.io.Fil
e;importjava.util.Date;importjavax.servlet.ServletContext;impor
torg.springframework.stereotype.Controller;importorg.springfram
ework.web.bind.annotation.RequestMapping;importorg.springframewo
rk.web.bind.annotation.RequestMethod;importorg.springframework.w
eb.bind.annotation.RequestParam;importorg.springframework.web.co
ntext.ServletContextAware;importorg.springframework.web.multipar
t.commons.CommonsMultipartFile;@ControllerpublicclassFileUpload
ControllerimplementsServletContextAware{privateServletContext
servletContext;@OverridepublicvoidsetServletContext(ServletCon
textcontext){this.servletContext=context;}@RequestMapping(va
lue="/upload.do",method=RequestMethod.POST)publicStringhandl
eUploadData(Stringname,@RequestParam("file")CommonsMultipartFile
file){if(!file.isEmpty()){Stringpath=this.servletContext.g
etRealPath("/tmp/");//获取本地存储路径System.out.println(path);String
fileName=file.getOriginalFilename();StringfileType=fileNam
e.substring(fileName.lastIndexOf("."));System.out.println(fileTy
pe);Filefile2=newFile(path,newDate().getTime()+fileType)
;//新建一个文件try{file.getFileItem().write(file2);//将上传的文件写入新建的文件
中}catch(Exceptione){e.printStackTrace();}return"redirect
:upload_ok.jsp";}else{return"redirect:upload_error.jsp";}}}5.建立
upload_ok.jsp页面<%@pagelanguage="java"import="java.util."page
Encoding="gbk"%>sitional//EN">

上传成功!


6.建立upload_error.jsp页面<%@pagelanguage="java"import="j
ava.util."pageEncoding="gbk"%>DHTML4.01Transitional//EN">

上传
失败!

发布项目,运行测试:http://localhost:8080/springmvc0
3/upload.jsphttp://localhost:8080/springmvc03/upload.jsp进入项目发布后的
目录,发现文件上传成功:处理ajax请求spring使用了jackson类库,帮助我们在java对象和json、xml数据之间的互
相转换。他可以将控制器返回的对象直接转换成json数据,供客户端使用。客户端也可以传送json数据到服务器进行直接转换。使用步骤如
下:?1.项目中需要引入如下两个jar包:jackson-core-asl-1.7.2jarjackson-mapper-as
l-1.7.2jar2.spring配置文件中修改:lass="org.springframework.web.servlet.mvc.annotation.AnnotationMe
thodHandlerAdapter">
ringframework.http.converter.json.MappingJacksonHttpMessageConver
ter">
客户端代码a.jsp如下:<%@page
language="java"import="java.util."pageEncoding="gbk"%><%Strin
gpath=request.getContextPath();StringbasePath=request.getSc
heme()+"://"+request.getServerName()+":"+request.getServerPort()+
path+"/";%>nal//EN">">MyJSP<br>''index.jsp''startingpagent="no-cache">>ds"content="keyword1,keyword2,keyword3">ption"content="Thisismypage"><
ahref="javascript:void(0);"onclick="sendAjaxReq();">测试id="div1">服务器端代码如下:packagecom.sxt.web;impo
rtjava.io.UnsupportedEncodingException;importjava.util.ArrayLis
t;importjava.util.List;importorg.springframework.stereotype.Con
troller;importorg.springframework.web.bind.annotation.RequestBod
y;importorg.springframework.web.bind.annotation.RequestMapping;i
mportorg.springframework.web.bind.annotation.RequestMethod;impor
torg.springframework.web.bind.annotation.ResponseBody;importcom.sxt.po.User;@Controller@RequestMapping("myajax.do")publicclassMyAjaxController{@RequestMapping(params="method=test1",method=RequestMethod.GET)public@ResponseBodyListtest1(Stringuname)throwsException{Stringuname2=newString(uname.getBytes("iso8859-1"),"gbk");System.out.println(uname2);System.out.println("MyAjaxController.test1()");Listlist=newArrayList();list.add(newUser("高淇","123"));list.add(newUser("马士兵","456"));returnlist;}}测试。启动服务器。输入:http://localhost:8080/springmvc03/a.jsphttp://localhost:8080/springmvc03/a.jspSpring中的拦截器定义spring拦截器两种基本方式实现接口:org.springframework.web.servlet.HandlerInterceptor。接口中有如下方法需要重写:注意:参数中的Objecthandler是下一个拦截器。publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException该方法在action执行前执行,可以实现对数据的预处理,比如:编码、安全控制等。如果方法返回true,则继续执行action。publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器实现了HandlerInterceptor接口。提供了这个接口中所有方法的空实现。如下我们写出两个拦截器的示例代码,仅供大家参考:packagecom.sxt.interceptor;importjavax.interceptor.Interceptors;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;publicclassMyInterceptorimplementsHandlerInterceptor{@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("最后执行!!!一般用于释放资源!!");}@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("Action执行之后,生成视图之前执行!!");}@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("action之前执行!!!");returntrue;//继续执行action}}packagecom.sxt.interceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;publicclassMyInterceptor2extendsHandlerInterceptorAdapter{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("MyInterceptor2.preHandle()");returntrue;//继续执行action}}XML中如何配置。如下为示例代码:
献花(0)
+1
(本文系关平藏书首藏)