Spring记录之SpringMVC
Spring的Web框架是围绕分发器(DispatcherServlet)设计的,DispatcherServlet用来将请求分发到不同的处理器,框架还包括了控制器映射(HandlerMapping),视图解析(ViewResolver),本地化,主题解析,支持文件上传
运行机制
- (1)客户端向Spring发送HTTP请求
- (2)前端控制器DispatcherServlet拦截请求,并扫描控制器,适配合适的Controller来处理请求
- (3)DispatcherServlet根据HandlerMapping选择并决定将请求发送到哪个Controller。
- (4)被选定的Controller处理请求,并以ModelAndView(属性值和返回页面)的形式返回给DispatcherServlet
- (5)返回给DispatcherServlet的未必都是JSP,可能是逻辑视图。DispatcherServlet查询ViewResolver对象,解析视图。
- (6)找到对应的视图,将视图返回给客户端,否则报错。
SpringMVC特点
自由灵活
适合做REST风格的URL
配置SpringMVC
- (1)在web.xml配置前端控制器DispatcherServlet
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- (2)配置SpringMVC.xml配置文件
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
- 需要文件上传时配置
<!-- Only needed because we require fileupload in the org.springframework.samples.mvc.fileupload package 名字都不能改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
- 注解方式开发配置
<mvc:annotation-driven/>
<context:component-scan base-package="com.spring.spring_mvc.annotation"/>
- 拦截器配置
<mvc:interceptors>
<mvc:interceptor>
<!-- 某一模块的拦截:/myPath/**, 拦截所有的请求/** -->
<mvc:mapping path="/**"/>
<bean class="com.spring.spring_mvc.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
- Controller编写
@Controller
@RequestMapping("/news")//namespace,不同模块
public class HelloController {
@RequestMapping("/say")
public String say() {
System.out.println();
return "index";
}
@RequestMapping("/person1")
public String person(Map<String,Object> map){
Person person1 = new Person("Hello",66);
map.put("p",person1);
return "index";
}
@RequestMapping("/person2")
public String person(ModelMap model){
Person person1 = new Person("Hello",66);
model.addAttribute("p", person1);
return "index";
}
@RequestMapping("/entity/status")
public ResponseEntity<String> responseEntityStatusCode() {
return new ResponseEntity<String>("The String ResponseBody with custom status code (403 Forbidden)",
HttpStatus.FORBIDDEN);
}
}