Spring入门笔记--Spring MVC
Spring MVC
开发步骤
开发步骤:
- maven导入SpringMVC
- 配置SpringMVC核心控制器DispathcerServlet
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
- 配置SpringMVC核心文件spring-mvc.xml
- 客户端发起请求测试
Spring MVC执行流程

配置文件
web.xml
<servlet>
<servlet-name>DispatchServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--contextConfigLocation用来标识要载入的Spring配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
其中,contextConfigLocation之前有说明:Spring入门笔记--Spring集成web环境
拦截器
执行流程:https://blog.csdn.net/qq_16050561/article/details/104427508
拦截器、过滤器、监听器:https://zhuanlan.zhihu.com/p/442012465
- 监听器:web容器的,监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件。比如说ServletContextListener监听web应用的启动,创建上下文对象ApplicationContext,并存储在最大的域servletContext中。
- 过滤器:web容器的,web.xml中配置,比如说过滤非法url
- 拦截器:spring-mvc的
拦截器样例
public class MyInterceptor1 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("prehandler done");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("posthandler done");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
spring-mvc.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.yihao.mvc.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
Spring MVC的注解
| 注解 | 作用 |
|---|---|
| @Controller | 标识控制器 |
| @RequestMapping | 路径,请求方法和参数 |
| @RequestParam | 进行数据绑定 |
| @PathVariable | 通过请求路径获取值 |
spring-mvc.xml
<!--Controller的组件扫描-->
<context:component-scan base-package="com.yihao.mvc">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/quick",method = RequestMethod.GET)
public String save() {
return "success";
} //返回值会作为视图路径/success
@RequestMapping(value = "/quick9",method = RequestMethod.GET)
public void save9(@RequestParam(name = "name1") String name) {
System.out.println(name); //@RequestParam指定name接收请求中的name1
}
@RequestMapping(value = "/quick{num}",method = RequestMethod.GET)
public void save10(@PathVariable int num) {
System.out.println(num); //@PathVariable可以接收路径中的值
}
}
//如果请求为/user/quick9?name1=yihao 那么方法9和10都会执行
说明:组件扫描只扫描注解为Controller的;内部资源视图解析器默认拼接前缀/jsp/和后缀.jsp
数据响应
字符串形式
如上面所示,返回字符串会拼接前缀和后缀
ModelAndView
@RequestMapping("/quick2")
public String save2(ModelAndView mv) { //Spring会自动注入一个形参供使用
mv.setViewName("success");
return "success";
}
response回写
response.getWriter().print("hello itcast");
responseBody回写
@ResponseBody注解就行,return字符串不会作为视图
返回对象或集合
返回对象或集合,使用指定的转换器转换成为字符串,@ResponseBody注解仍然保留。
spring-mvc.xml
<!--配置handler映射器,将返回对象转换成json-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<!--简写,等效上面,推荐这种方式-->
<mvc:annotation-driven/>
@RequestMapping(value = "/quick8")
@ResponseBody
public User save8() { //方法返回对象,最终前台打印字符串json {"name":"yihao","age":11}
User user = new User();
user.setAge(11);
user.setName("yihao");
return user;
}
请求参数
支持的类型有:
1.基本数据类型 2.POJO类型 3.数组类型 3.集合类型
- 请求中携带的参数会自动映射到形参中,如果形参是对象,参数和对象属性名称匹配即可映射。
- 集合类型也可以映射:定义Vo,vo的属性private List<User> userList; 通过vo接收数据。
- 集合类型还有一种用法,请求时使用json封装,接收添加@RequestBody注解
@RequestMapping(value = "/quick6")
@ResponseBody
public void save6(@RequestBody List<User> userList) {
System.out.println(userList);
}
请求js:
var userList = new Array();
userList.push({username:"yihao", age:27});
userList.push({username:"yiyan", age:23});
$.ajax({
type: "post",
url: "${pageContext.request.contextPath}/user/quick6",
data:JSON.stringify(userList),
contentType: "application/json;charset=utf-8"
});
静态资源访问
<!--开放部分路径-->
<mvc:resources mapping="/img/**" location="/img/"/>
<!--默认使用容器处理,tomcat自动查找静态资源-->
<mvc:default-servlet-handler/>
自定义转换器
<!--配置处理适配器(上文已提到),注意,如果该配置存在,会使下面自定义转换器失效,推荐下面的方法-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<!---------------------------------------------------------------------->
<!--配置处理适配器,指定自定义转换器-->
<mvc:annotation-driven conversion-service="owndefined"/>
<!--指定转换器的id-->
<bean id="owndefined" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!--自定义的转换器实现-->
<bean class="com.yihao.mvc.converter.DateConverter"/>
</set>
</property>
</bean>
@Component
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
/*转换*/
return new Date();
}
}
对于转换器失效问题不理解,
Servlet参数
可以对作为控制器入参的ServletAPI进行注入:
- HttpServletRequest
- HttpServletResponse
- HttpSession
获取请求头
@CookieValue
@RequestHeader
浙公网安备 33010602011771号