1.spring MVC 的分层问题:通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages JSP)技术、VelocityTilesiText  POISpring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了 控制器、模型 对象、分派器以及处理程序对象的角,这种分离让它们更容易进行定制。
web写代码时,需要将代码进行分层,分层的目的是使代码的层次更加清晰。
一、web主要分为如下几层:
model:实体类。
DAO:数据库的增删改查。
Action:action 是业务层的一部分,是一个管理器 (总开关)(作用是取掉转)(取出前台界面的数据,调用biz方法,转发到下一个action或者页面) 
Service/BIZ:业务逻辑层。
ui层。
MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,C(控制器)将V(视图、用户客户端)与M(模块,业务)分开构成了MVC ,这边不去讨论项目中是否应用MVC ,也不针对MVC的实现原理进行讲解,而是探讨实践中如何从应用SSH, Struts(Struts MVC)+Spring+Hibernate的演化过程。
先看 Struts 如何与 Spring 结合处理一次简单的请求响应代码,前台可以设为用 AJAX 调用:
1. l 文件中加入
<!--用于声明GetPersonListdo请求委托Spring处理--><actionpath="/GetPersonList" scope="request"type="org.springframework.web.struts.DelegatingActionProxy"></action>
2. l 文件中加入
<beanname="/GetPersonList" class="cn.base.GetPersonListAction">ref=" getPersonListServices">
3.base.GetPersonListAction 实现请求响应代码
可以看出一次请求需求如此多的步骤,在加上一个项目下来有很多这样的请求响应,将给配置文件管理带来很大的麻烦。
经过对 Spring 的深入应用, Spring 本身提供的 URL 请求控制,对其天然支持可以让我们不需要 l 再次声明一次 URL 请求 Bean ,即减少了 Struts 的声明 URL ,达到减少些繁琐的配置。但只是少了一些而已,同样也会面临着配置文件的管理问题。
Spring 注解将给我们的工作带来些轻松,利用反射机制原理出现的注解就是为了解决配置大量的配置问题。请看下处理一次简单的请求响应代码
@Controller --声明控制器@RequestMapping("/person") –声明URL
public class PersonControl extends BaseController {
@Autowired –业务接口注入
private personServices personServices;/*** 获得人员列表*
@param request* @param response* @throws Exception*/@RequestMapping(params = "method=geList") --即处理/person.do? method=geList方法
public void getnodeList(HttpServletRequest request,HttpServletResponse response) throws Exception { //处理请求//处理响应}}
可以看出,在代码上加入注解可以省去我们上面说的多个配置文件的工作,达到简便的 MVC 处理请求响应。
在配上简单的配置文件声明,即可轻松处理项目的全部请求控制工作。
Spring MVC乱码问题
在使用Spring MVC java Web 项目时,乱码问题时常都会出现,解决方法也不尽相同,有简单也有复杂的;如果加入了Spring框架之后就不一样了,可以采用Spring框架自带的过滤器CharacterEncodingFilter,这样可以大大减轻了我们的工作量,即简单方便又容易理解,配置方式如下:在l文件中filter的位置加上如下内容:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
value>UTF-8
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
springmvc实现上传文件代码片段
<?xml version="1.0" encoding="UTF-8"?>
<bean id="multipartResolver" class="org.springframework.web.multipartmons.CommonsMultipartResolver" /></bean>
@Controller@RequestMapping("/common")
public class CommonController {
@RequestMapping(value = "/upload")
public @ResponseBody String upload(@RequestParam("file") MultipartFile file, HttpSession session) throws Exception {
File localFile = new File("c:/test/a.rar");
ansferTo(localFile);
return "success";
}
}
1. 原理 
Spring MVC按植物分类学属于Martin Flower〈企业应用模式〉里的静态配置型Front Controler,使用DispatchServlet截获所有*.do的请求,按照xml文件的配置,调用对应的Command对象的 handleRequest(request,response)函数,同时进行依赖对象的注入。
我们的Controller层,就是实现handleRequest(request,response)函数的普通JavaBean

2. 优势
Spring MVCstruts相比的优势:
一是它的Controller有着从松到紧的类层次结构,用户可以选择实现只有一个HandleRequest()函数的接口,也可以使用它有很多回调函数的SimpleFormController类。
二是不需要Form Bean,也不需要Tapestry那所谓面向对象的页面对象,对于深怕类膨胀,改一个东西要动N个地方的人最适合不过。
三是不需要强XML配置文件,宣告式编程是好的,但如果强制成框架,什么都要在xml里面宣告,写的时候繁琐,看的时候也要代码配置两边看才能明白就比较麻烦了。

Webwork?没有实战过,不过因为对MVC框架所求就不多,单用Spring MVCController已经可以满足需求,就不多搞一套Webwork来给团队设坎,还有给日后维护,spring,ww2之间的版本升级添麻烦了。真有什么需要添加的,Spring MVC源代码量很少,很容易掌控和扩展。


3.化简
3.1. 直接implement Controller,实现handleRequest()函数
首先,simple form controller非我所好,一点都不simple。所以有时我会直接implement Controller接口。这个接口的唯一函数是供Front Controller调用的handleRequest(request,response)
如果需要applicationspringmvc选择题对象,比如想用RealPath()时,就要extends webApplicationObjectSupport

3.2.每个Controler负责一组相关的action
我是坚决支持一个Controler负责多个action的,一个Controler一个action就像一个function一个类一样无聊。所以我用最传统的方式,用URL参数如msg="insert"把一组相关action交给一个Controler控制。ROR与制作中的Groovy On Rails都是这种模式,Spring也有MultiActionController支持。
以上三者都是把URL参数直接反射为Controller的函数,而Stripes的设计可用annotation标注
url action到响应函数的映射。
l宣告式编程的取舍 
我的取舍很简单,反正Spring没有任何强制,我只在可能需要不重新编译而改变某些东西的时候,才把东西放在xml里动态注入。jsp路径之类的就统统收回到controller里面定义
2.spring mvc 常用注解:spring mvc常用的注解:

介绍。
@Controller
@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为

类名称开头字母小写,你也可以自己指定,如下
方法一:
@Controller
public class TestController {}
 
方法二:           
@Controller("tmpController")
public class TestController {}
 
@RequestMapping
 
1.@RequestMapping用来定义访问的URL,你可以为整个类定义一个

@RequestMapping,或者为每个方法指定一个。
把@RequestMapping放在类级别上,这可令它与方法级别上的

@RequestMapping注解协同工作,取得缩小选择范围的效果。
例如:
@RequestMapping("/test")
public class TestController {}
则,该类下的所有访问路径都在/test之下。
 
2.将@RequestMapping用于整个类不是必须的,如果没有配置,所有的方法

的访问路径配置将是完全独立的,没有任何关联。
 
3.完整的参数项为:@RequestMapping(value="",method =

{"",""},headers={},params={"",""}),各参数说明如下:
value :String[] 设置访问地址
method: RequestMethod[]设置访问方式,字符数组,查看RequestMethod

类,包括GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE,常用

RequestMethod.GET,RequestMethod.POST
headers:String[] headers一般结合method = RequestMethod.POST使用
params: String[] 访问参数设置,字符数组 例如:userId=id
 
4.value的配置还可以采用模版变量的形式 ,例如:@RequestMapping

(value="/owners/{ownerId}", method=RequestMethod.GET),这点将在介

绍@PathVariable中详细说明。
 
5.@RequestMapping params的补充说明,你可以通过设置参数条件来限制

访问地址,例如params="myParam=myValue"表达式,访问地址中参数只有

包含了该规定的值"myParam=myValue"才能匹配得上,类似"myParam"之类

的表达式也是支持的,表示当前请求的地址必须有该参数(参数的值可以是

任意),"!myParam"之类的表达式表明当前请求的地址不能包含具体指定的

参数"myParam"。
 
6.有一点需要注意的,如果为类定义了访问地址为*.do,*.html之类的,则

在方法级的@RequestMapping,不能再定义value值,否则会报错,例如
Java代码 
@RequestMapping("/bbs.do") 
public class BbsController { 
    @RequestMapping(params = "method=getList") 
    public String getList() { 
    return "list"; 
    } 
@RequestMapping(value= "/spList") 
public String getSpecialList() { 
    return "splist"; 
    } 

 
如上例:/bbs.do?method=getList 可以访问到方法getList() ;而访

问/bbs.do/spList则会报错.
 
@PathVariable
1.@PathVariable用于方法中的参数,表示方法参数绑定到地址URL的模板

变量。
例如:
Java代码 
@RequestMapping(value="/owners/{ownerId}",

method=RequestMethod.GET) 
public String findOwner(@PathVariable String ownerId, Model

model) { 
  Owner owner = ownerService.findOwner(ownerId);   
  model.addAttribute("owner", owner);   
  return "displayOwner"; 

 
2.@PathVariable用于地址栏使用{xxx}模版变量时使用。
如果@RequestMapping没有定义类似"/{ownerId}" ,这种变量,则使用在


方法中@PathVariable会报错。
 
 
@ModelAttribute
1.应用于方法参数,参数可以在页面直接获取,相当于

request.setAttribute(,)
2.应用于方法,将任何一个拥有返回值的方法标注上 @ModelAttribute,使

其返回值将会进入到模型对象的属性列表中.
3.应用于方法参数时@ModelAttribute("xx"),须关联到Object的数据类型

,基本数据类型 如:int,String不起作用
例如:
Java代码 
@ModelAttribute("items")//<——向模型对象中添加一个名为items的

属性 
public List<String> populateItems() { 
        List<String> lists = new ArrayList<String>(); 
        lists.add("item1"); 
        lists.add("item2"); 
        return lists; 

@RequestMapping(params = "method=listAllBoard") 
public String listAllBoard(@ModelAttribute("currUser")User user,

ModelMap model) { 
        AllBoard(); 
        //<——在此访问模型中的items属性 
        System.out.println("model.items:" + ((List<String>)

("items")).size()); 
        return "listBoard"; 

 
处,通过使用 @ModelAttribute 注解,populateItem() 方法将在

任何请求处理方法执行前调用,Spring MVC 会将该方法返回值以“items

”为名放入到隐含的模型对象属性列表中。
所以在 处,我们就可以通过 ModelMap 入参访问到 items 属性,当执

行 listAllBoard() 请求处理方法时, 处将在控制台打印


出“model.items:2”的信息。当然我们也可以在请求的视图中访问到模型

对象中的 items 属性。
 
 
@ResponseBody
这个注解可以直接放在方法上,表示返回类型将会直接作为HTTP响应字节

流输出(不被放置在Model,也不被拦截为视图页面名称)。可以用于ajax。
 
@RequestParam
@RequestParam是一个可选参数,例如:@RequestParam("id") 注解,所以

它将和URL所带参数 id进行绑定
如果入参是基本数据类型(如 int、long、float 等),URL 请求参数中

一定要有对应的参数,否则将抛出

org.springframework.web.util.NestedServletException 异常,提示无

法将 null 转换为基本数据类型.
 
@RequestParam包含3个配置 @RequestParam(required = ,value="",

defaultValue = "")
required :参数是否必须,boolean类型,可选项,默认为true
value: 传递的参数名称,String类型,可选项,如果有值,对应到设置方

法的参数
defaultValue:String类型,参数没有传递时为参数默认指定的值
 
@SessionAttributes session管理
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到

session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问

到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来

实现的。@SessionAttributes 只能声明在类上,而不能声明在方法上。
 
例如
 
@SessionAttributes("currUser") // 将ModelMap 中属性名为currUser 的属性



@SessionAttributes({"attr1","attr2"})
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class,Dept.class})
@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"})

 
@CookieValue 获取cookie信息
@RequestHeader 获取请求的头部信息

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。