URLBasedViewResolver
UrlBasedViewResolver 是对 ViewResolver 的一种简单实现,主要提供了一种拼接 URL 的方式来解析视图。
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
Spring MVC接口
Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下面对各个组件的功能说明如下。
1)DispatcherServlet
DispatcherServlet 是前端控制器,从图 1 可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。
2)HandlerMapping
HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)信息。
3)HandlerAdapter
HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。
4)Handler
Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。
5)View Resolver
View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)。
6)View
View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。
以上组件中,需要开发人员进行开发的是处理器(Handler,常称Controller)和视图(View)。通俗的说,要开发处理该请求的具体代码逻辑,以及最终展示给用户的界面。
注意:由于 Spring MVC 结构比较复杂,所以学习的时候也要掌握学习方法。首先要明确 Spring MVC 是一个工具,既然是工具,那么我们就需要先掌握工具的使用方法,不要陷入细节中,深入浅出,慢慢通过实际运用来加深对其的理解。
Controller注解
在 net.biancheng.controller 包中创建控制器类 IndexController
package net.biancheng.controller;
import org.springframework.stereotype.Controller;
@Controller
public class IndexController {
}
springmvcDemo 应用的配置文件 springmvc-servlet.xml 中添加以下代码:
<!-- 使用扫描机制扫描控制器类,控制器类都在net.biancheng.controller包及其子包下 -->
<context:component-scan base-package="net.biancheng.controller" />
RequestMapping注解
- value 属性
@RequestMapping(value="toUser")
@RequestMapping("toUser")
- path属性
@RequestMapping(path="toUser")
- name属性
@RequestMapping(value = "toUser",name = "获取用户信息")。
- method属性
@RequestMapping(value = "toUser",method = RequestMethod.GET)
@RequestMapping(value = "toUser",method = {RequestMethod.GET,RequestMethod.POST})
- params属性
@RequestMapping(value = "toUser",params = "type")
public String toUser() {
return "showUser";
}
- header属性
@RequestMapping(value = "toUser",headers = "Referer=http://www.xxx.com")
- consumers属性
@RequestMapping(value="toUser",consumers="application/json");
- produces属性
produces 属性用于指定返回的内容类型
@RequestMapping(value="toUSer",produces="application/json,charst=utf-8");
通过请求URL进行映射
1)方法级别注解
@Controller
public class IndexController{
@RequestMapping(value="/index/login")
public String login(){
return "login";
}
@RequestMapping(value="/index/register")
public String register(){
return "register";
}
}
2)类级别注解
@Controller
@RequestMapping("/index")
public class IndexController{
@RequestMapping("/login")
public Sting login(){
return "login";
}
}
通过请求参数、请求方法进行映射
package net.biancheng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping(value = "/index/success" method=RequestMethod.GET, Params="username")
public String success(@RequestParam String username) {
return "index";
}
编写请求处理方法⭐
1)请求处理方法中常出现的参数类型
package net.biancheng.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/login")
public String login(HttpSession session,HttpServletRequest request) {
session.setAttribute("skey", "session范围的值");
session.setAttribute("rkey", "request范围的值");
return "login";
}
}
2)请求处理方法常见的返回类型
请求处理方法可以返回如下类型的对象:
ModelAndView
Model
包含模型属性的 Map
View
代表逻辑视图名的 String
void
其它任意Java类型
最常见的返回类型就是代表逻辑视图名称的 String 类型,例如前面几节中的请求处理方法。
web.xml
springmvc-servlet.xml
User.java
UserController.java
index.jsp
login.jsp
register.jsp
当用户单击“注册”超链接时,控制器会将该请求转发给 UserController 的 getLogin 方法处理,处理后跳转到 /WEB-INF/jsp 下的 register.jsp 视图。同理,当单击“登录”超链接时,控制器处理后转到 /WEB-INF/jsp下的 login.jsp 视图。