Spring MVC
MVC设计模式
SpringMVC框架当然也是基于MVC设计模式的框架。MVC设计模式包含模型、视图、控制器三个模块。视图负责应用的显示(例如JSP/html),模型封装了应用的数据和业务逻辑,控制器负责接受用户的输入,改变模型,以及调整视图的显示。
其中servlet或者filter都可以充当控制器。Spring MVC 和 Struts1使用一个Servlet作为控制器,而struts2使用一个filter作为控制器。模型使用POJO(plain old java object)。
一个JavaBean必须拥有一个无参构造器,并且通过get/set方法来访问参数,同时支持持久化。
Spring mvc
1. Spring MVC的优点:
1) 若基于某个框架来开发一个基于MVC模式的应用,我们需要负责编写一个Dispatcher Servlet和控制器类。其中,Dispatcher servlet必须能做如下事情:
l 根据URI调用相应的action(即controller,控制器类,实现具体的业务逻辑)。
l 实例化正确的控制器类。
l 调用控制器对象的相应方法。
l 转向到一个视图(JSP页面)。
Spring MVC是一个包含了Dispatcher servlet的MVC框架。它调用控制器方法并转发视图。不用编写Dispatcher servlet是使用Spring MVC的第一个好处。
2) Spring MVC中使用基于xml的配置文件。
3) Spring MVC实例化控制器,并根据用户输入来构造bean。
4) Spring MVC可以自动绑定用户输入,并正确地转换数据类型。
5) Spring MVC内置了常用的校验器。
6) Spring MVC是spring框架的一部分,可以利用Spring框架提供的其他能力。
7) 支持国际化和本地化,支持多种视图技术。
2. Spring MVC开发使用
1) Spring MVC内置Dispatcher Servlet的使用:
l 在web.xml中配置
l Dispatcher Servlet初始化时会在WEB-INF下寻找对应命名为servletName-servlet.xml的配置文件,servletName为之前声明的Dispatcher servlet 的 name。当然也可以把Spring MVC的配置文件放在应用程序目录的任何地方,用servlet定义的init-param元素,以便Dispatcher servlet加载到该文件,例如:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/personalBlog-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2) 控制器开发(旧版,实现controller接口)
在Spring2.5版本前,开发控制器需要实现org.springframework.web.servlet.mvc.Controller接口。这个接口公开了一个handleRequest方法,该方法签名如下:
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)
开发完毕需在SpringMVC的bean配置文件中声明,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- bean definitions here -->
<bean name="/hello.action" class="controller.HelloController"></bean>
</beans>
将/hello.action映射到该控制器上。
3) * View Resolver
通过在配置文件中定义视图解析器负责解析视图,这样view路径将缩短,仅需提供jsp文件名称即可完成页面跳转。SpringMVC-servlet.xml配置view resolver如下:
4) 基于注解的控制器
使用基于注解的控制器的优点:其一,一个控制器类可以处理多个动作(区别于实现Controller接口);其二,控制器的映射由RequestMapping注释处理,而不用在xml文件中配置。
基于注解的控制器使用方法:
a) Spring使用扫描机制来找到应用程序中所有基于注解的控制器类。为了使Spring能够找到你的控制器,需要在Spring MVC的配置文件中做如下处理:
首先,在配置文件中声明Spring-context,如下:
<beans
…
xmlns : context=http://www.springframework.org/schema/context
…
>
然后,需要应用<component-scan/>元素,如下:
<context: component-scan base-package=”basePackage(控制器所在包)”>
b) 编写请求方法:每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。下面是可以在请求处理方法中出现的参数类型:
l javax.servlet.ServletRequest/ javax.servlet.http.HttpServletRequest
l javax.servlet.ServletResponse/ javax.servlet.http.HttpServletResponse
l …HttpSession
l java.util.Locale
l 表单对象
l 带@PathVariable注释的对象
l org.springframework.ui.Model类型, 每次调用请求处理方法时,Spring MVC都创建Model对象并将其Map注入到各种对象。
l …
请求方法可以返回如下类型对象:
l ModelAndView
l Model
l Map包含模型的属性
l View
l 代表逻辑视图名的String
l Void
l …
c) 使用@Controller 和 @RequestMapping 标注处理方法,如下:
请求映射的值可以是一个空字符串,此方法被映射到如下网址:
http://localhost:8080/context,可以用该方法设置应用程序的默认访问页。如下:
@RequestMapping(value="/")
public String welcomePage(Model Model){
return "welcome";
}
5) *重定向和Flash属性
转发跟重定向的区别:转发比重定向快,因为重定向经过客户端,而转发没有。若需要重定向到一个外部网站,则无法使用转发。另外,使用重定向可以避免在用户重新加载页面时再次调用同样的动作。使用重定向的一个不方便的地方是:无法轻松传值给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都在重定向时丢失。可以通过Flash属性提供一种供重定向传值的方法。
Flash使用方法:
a) 首先在Spring MVC配置文件中,需要有个<annotation-driven/>元素
b) 然后需要在方法上添加一个新的参数类型org.springframework.web.sevlet.mvc.support.RedirectAttributs,如下:
@RequestMapping(value="/saveAndUpdateBlog")
public String saveAndUpdateBlog(@RequestParam int blogID, @ModelAttribute Blog blog, RedirectAttributes redirectAttributes){
if(blogID == 0){
blogMapper.save(blog);
}else{
Map<String, Object> parm = new HashMap<>();
parm.put("blogID", blogID);
parm.put("blog", blog);
blogMapper.update(parm);
}
String tags = blog.getBlogTags();
String[] tagList = tags.split("\\s+");
/**返回前台结果**/
Map<String, Object> responseParm = new HashMap<>();
responseParm.put("blog", blog);
responseParm.put("tagList", tagList);
redirectAttributes.addFlashAttribute("responseParm",responseParm);
return "redirect:/blog/" + blog.getBlogID();
}
6) *请求参数和路径变量
请求参数获取方法:
http://localhost:8080/context/method?valuename=value
Spring MVC中可以使用@RequestParm注释类型来注释方法参数,如下:
Public void sendProduce(@RequesetParam int valuename)
而且@RequestParam注解的参数类型不一定是字符串
路径变量的获取方法:
http://localhost:8080/context/method/productID,获取produceID的值方法如下:
@RequestMapping(value=”/method/{productID}”)
Public String viewProduct(@PathVariable Long id, Modelmodel){
...
}
当有多个路径变量时可能会倒是解析错误,导致404错误,不过可以使用JSTL的<c:url value=””/>标签来解决。