web.xml配置
<servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
注解学习
@RequestMapping
/*有两种方式1. 加在类上(多一个访问层级,方法上还是要加)2. 加在方法上属性值@RequestMapping(value="", method=RequestMethod.POST)@RequestMapping(params={}, headers={})params={"name"} : 表示请求参数要有nameparams={"!name"} : 表示请求参数不能有nameparams={"name", "age!=10"} : 表示请求参数要有name和age,同时age不等于10headers={"Accept-Language=en-US"} : 表示请求头的该参数的值要为en-USant风格的路径,使用通配符? :表示1个字符 (/?/test)* :表示多个字符(/*/test)** :表示多层路径(/**/test)*/
@PathVariable
PathVariable示例
/**/public class SpringMVC {@RequestMapping("springmvc/{id}")public void testPathVariable(@PathVariable(value="id") Integer id) {System.out.println(id);}}
HiddenHttpMethodFilter
/*发送 get, post, put, delete 四种请求*/1. 在web.xml中配置过滤器 HiddenHttpMethodFilter ,过滤所有请求<filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class></filter-class></filter><filter-mapping><filter-name></filter-name><url>/*</url> //过滤所有请求</filter-mapping>2. 后端配置RequestMapping时指定method属性@RquestMapping(value="springmvc/{id}", method=RequestMethod.PUT)public void testPUT(@PathVariable Integer id) {System.out.println(id);}3. 前端请求将post转换为 put和delete 时要使用name为 _method 的隐藏域<form action="springmvc/1" method="post"><input name="_method" value="PUT"/></form>
@RequestParam(映射请求参数)
属性:value, required, defaultValue
public class SpringMVC {/*value:表示请求中参数的名字required:表示改参数是否必要defaultValue:表示默认值,如果为int类型则要加此属性在请求没有改参数的情况下*/@RequestMapping(value="testRequestParam")public void testRequestParam(@RequestParam(value="user", required=false, defaultValue="0") int id) {System.out.println(id);}}
@RequestHeader
属性:value
与RequestParam相同,但是是将请求头中的值映射到方法参数中
public class SpringMVC {/*value:表示请求中参数的名字required:表示改参数是否必要defaultValue:表示默认值,如果为int类型则要加此属性在请求没有改参数的情况下*/@RequestMapping(value="testRequestParam")public void testRequestParam(@RequestHeader(value="Accept-Language", required=false, defaultValue="0") int id) {System.out.println("Accept-Language:" + id);}}运行结果是请求头中Accept-Language的值
@CookieValue
属性:value, required, defaultValue
获取Cookie中的值,将cookie中的对应的值映射到方法参数中
@ModelAttribute(待完善)
POJO
方法参数中写servlet的原生API
HttpServletRequestHttpServletReponseHttpSessionInputStreamOutputStreamReaderWriterLocalejava.security.Principal
处理模型数据
ModelAndView(addObject的值会放至request域)
public class SpringMVC {public ModelAndView testModelAndView() {ModelAndView mav = new ModelAndView("success.jsp");mav.addObject("","");return mav;}}
Map作为入参(request域)
public class SpringMVC {public String testMap(Map<String, Object> map) {map.put("user", "JACK");return "success.jsp";}}
@SessionAttribute(session域)
属性:value,type
只能加在类上
@SessionAttribute(value={"user"}, type={String.class})public class SpringMVC {public String testMap(Map<String, Object> map) {map.put("user", "JACK");return "success.jsp";}}
InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">//pages后面的斜杠一定要加<property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean>
自定义视图(待完善)
BeanNameViewResolver
- 配置视图解析器 ```java
2. 自定义视图实现 View 接口java
public class HelloView implements View {
@Override
public String getContentType(){
return “text/html”;
}
@Override
public void render(Map<a name="uF3ze"></a>
# 转发和重定向java
/*
当返回的字符串中以forward: 或 redirect: 开头时,将进行转发或重定向
/
public class SpringMVC {
public String testForward() {
return “forward:/index.jsp”;
}
public String testRedirect() {
return “redirect:/index.jsp”;
}
}
<a name="cEGQu"></a>
# SpringMVC处理静态资源java
<a name="bFfpR"></a>
# 自定义转换器java
1. 写一个转换器类,实现SpringMVC 的Converter<a name="iC4td"></a>
# @InitBinder(数据绑定的初始化设置)java
//使用@InitBinder注解的方法的返回值必须是void
public class SpringMVC {
@InitBinder
public void initBinder(WebDataBinder binder) {
//数据绑定过程中哪一个值不进行赋值
binder.setDisallowedField(“LastName”);
}
}
<a name="xZZWl"></a>
# 数据格式化
<a name="VlmH2"></a>
## @DateTimeFormat(pattern="")
<a name="zF7ij"></a>
## @NumberFormat(pattern="")
<a name="DPI6T"></a>
# JSR303数据校验java
/
1. 添加Hibernate Validator 框架的jar包
2. 配置 <a name="PRkJ6"></a>
# @RequestBody和@ResponseBody
<a name="uK3dA"></a>
# 文件上传(MutipartFile)
1. 添加相关jar包
1. 在xml中配置MultipartResolverjava
3. 入参使用MultipartFile接收java
@Controller
public class SpringMVC {
@RequestMapping(value=”testFileUpload”)
public String testFileUpload(@RequestParam(value=”file”) MutipartFile file, @RequestParam(value=”desc”) String desc) {
System.out.println(file.getOriginalFilename());
System.out.println(file.getInputStream());
return “success.jsp”;
}
}
<a name="lFgAZ"></a>
# 拦截器使用及配置
1. xml中配置拦截器java
<mvc:interceptor><mvc:mapping path="/emps"/><bean class=""></bean></mvc:interceptor>
2. 编写自定义拦截器类实现HandlerInterceptor接口```javapublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {}@Overridepublic boolean postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {}@Overridepublic boolean afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler) {}}
异常处理(ExceptionHandler)
HandlerExceptionResolver
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
SimpleMappingExceptionResolver
@ExceptionHandler
/*1. 入参 ex 即为发生异常的异常对象2. 加@ExceptionHandler的方法不能有Map<String, Object>的入参*/@Controllerpublic class SpringMVC {@ExceptionHandler({RuntimeException.class})public ModelAndView handleException(Exception ex) {System.out.println(ex);}}
@ControllerAdvice
/*加 @ControllerAdvice 注解的类,handler发生异常时如果在本类中找不到ExceptionHandler则会到这个注解的类中找*/@ControllerAdvicepublic class HandleExceptions {@ExceptionHandler({RuntimeException.class})public ModelAndView handleException(Exception ex) {System.out.println(ex);}}
@ResponseStatus
属性:value,reason
1. 加在自定义的异常类上@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="出异常了")public class MyException extends Exception {}2.加在方法上(方法正常执行但是会返回错误页面)public class SpringMVC {@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="出异常了")@RequestMapping("testResponseStatus")public String testResponseStatus(@RequestParam(value="i") Integer i) {}}
SimpleMappingExceptionResolver
配置:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >//异常在域中的名字,默认是exception<property name="exceptionAttribute" value="ex"></property><property name="exceptionMappings"><props>//不同异常跳转不同错误界面<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop></props></property></bean>
SpringMVC运行流程
Spring和SpringMVC的整合
建议分开两个配置文件 spring.xml 和 springmvc.xml
为防止两个配置文件扫描的包有重合,导致创建两次对象
spring.xml :
<context:component-scan base-package="com.atguigu" use-default-filters="false"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /><context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan>
springmvc.xml :
<context:component-scan base-package="com.atguigu" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /><context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan>
