web.xml配置

  1. <servlet>
  2. <servlet-name>springDispatcherServlet</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springDispatcherServlet</servlet-name>
  12. <url-pattern>/</url-pattern>
  13. </servlet-mapping>

注解学习

@RequestMapping

  1. /*有两种方式
  2. 1. 加在类上(多一个访问层级,方法上还是要加)
  3. 2. 加在方法上
  4. 属性值
  5. @RequestMapping(value="", method=RequestMethod.POST)
  6. @RequestMapping(params={}, headers={})
  7. params={"name"} : 表示请求参数要有name
  8. params={"!name"} : 表示请求参数不能有name
  9. params={"name", "age!=10"} : 表示请求参数要有name和age,同时age不等于10
  10. headers={"Accept-Language=en-US"} : 表示请求头的该参数的值要为en-US
  11. ant风格的路径,使用通配符
  12. ? :表示1个字符 (/?/test)
  13. * :表示多个字符(/*/test
  14. ** :表示多层路径(/**/test
  15. */

@PathVariable

映射URL中的占位符到方法的参数中

PathVariable示例

  1. /*
  2. */
  3. public class SpringMVC {
  4. @RequestMapping("springmvc/{id}")
  5. public void testPathVariable(@PathVariable(value="id") Integer id) {
  6. System.out.println(id);
  7. }
  8. }

HiddenHttpMethodFilter

  1. /*发送 get, post, put, delete 四种请求*/
  2. 1. web.xml中配置过滤器 HiddenHttpMethodFilter ,过滤所有请求
  3. <filter>
  4. <filter-name>HiddenHttpMethodFilter</filter-name>
  5. <filter-class></filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name></filter-name>
  9. <url>/*</url> //过滤所有请求
  10. </filter-mapping>
  11. 2. 后端配置RequestMapping时指定method属性
  12. @RquestMapping(value="springmvc/{id}", method=RequestMethod.PUT)
  13. public void testPUT(@PathVariable Integer id) {
  14. System.out.println(id);
  15. }
  16. 3. 前端请求将post转换为 put和delete 时要使用name为 _method 的隐藏域
  17. <form action="springmvc/1" method="post">
  18. <input name="_method" value="PUT"/>
  19. </form>

@RequestParam(映射请求参数)

属性:value, required, defaultValue

  1. public class SpringMVC {
  2. /*
  3. value:表示请求中参数的名字
  4. required:表示改参数是否必要
  5. defaultValue:表示默认值,如果为int类型则要加此属性在请求没有改参数的情况下
  6. */
  7. @RequestMapping(value="testRequestParam")
  8. public void testRequestParam(@RequestParam(value="user", required=false, defaultValue="0") int id) {
  9. System.out.println(id);
  10. }
  11. }

@RequestHeader

属性:value

与RequestParam相同,但是是将请求头中的值映射到方法参数中

  1. public class SpringMVC {
  2. /*
  3. value:表示请求中参数的名字
  4. required:表示改参数是否必要
  5. defaultValue:表示默认值,如果为int类型则要加此属性在请求没有改参数的情况下
  6. */
  7. @RequestMapping(value="testRequestParam")
  8. public void testRequestParam(@RequestHeader(value="Accept-Language", required=false, defaultValue="0") int id) {
  9. System.out.println("Accept-Language:" + id);
  10. }
  11. }
  12. 运行结果是请求头中Accept-Language的值

@CookieValue

属性:value, required, defaultValue

获取Cookie中的值,将cookie中的对应的值映射到方法参数中

@ModelAttribute(待完善)

POJO

方法参数中写servlet的原生API

  1. HttpServletRequest
  2. HttpServletReponse
  3. HttpSession
  4. InputStream
  5. OutputStream
  6. Reader
  7. Writer
  8. Locale
  9. java.security.Principal

处理模型数据

ModelAndView(addObject的值会放至request域)

  1. public class SpringMVC {
  2. public ModelAndView testModelAndView() {
  3. ModelAndView mav = new ModelAndView("success.jsp");
  4. mav.addObject("","");
  5. return mav;
  6. }
  7. }

Map作为入参(request域)

  1. public class SpringMVC {
  2. public String testMap(Map<String, Object> map) {
  3. map.put("user", "JACK");
  4. return "success.jsp";
  5. }
  6. }

@SessionAttribute(session域)

属性:value,type

只能加在类上

  1. @SessionAttribute(value={"user"}, type={String.class})
  2. public class SpringMVC {
  3. public String testMap(Map<String, Object> map) {
  4. map.put("user", "JACK");
  5. return "success.jsp";
  6. }
  7. }

InternalResourceViewResolver

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. //pages后面的斜杠一定要加
  3. <property name="prefix" value="/WEB-INF/pages/"></property>
  4. <property name="suffix" value=".jsp"></property>
  5. </bean>

自定义视图(待完善)

BeanNameViewResolver

  1. 配置视图解析器 ```java
//视图解析器的执行顺序,越小越优先 //InternalResourceViewResolver的order是Integer的最大值 2. 自定义视图实现 View 接口java public class HelloView implements View { @Override public String getContentType(){ return “text/html”; } @Override public void render(Map map, HttpServletRequest request, HttpServletResponse response) { reponse.getWriter.print(); } } <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 T—>K 的接口 并且加上@Component注解加载到bean容器中 2. 在springmvc.xml中配置 <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. 配置 3. 为要校验的bean的属性添加注解(如:@NotEmpty等),为入参的bean添加@Valid注解 / 在可在入参紧靠需验证的bean的旁边添加 BindingResult 的入参用以获得错误消息 @Controller public class SpringMVC { @RequestMapping(value=”testJSR”) public String testJSR(@Valid Employee emp, BindingResult bindResult) { } } <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
  1. <mvc:interceptor>
  2. <mvc:mapping path="/emps"/>
  3. <bean class=""></bean>
  4. </mvc:interceptor>

  1. 2. 编写自定义拦截器类实现HandlerInterceptor接口
  2. ```java
  3. public class MyInterceptor implements HandlerInterceptor {
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  6. }
  7. @Override
  8. public boolean postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  9. }
  10. @Override
  11. public boolean afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler) {
  12. }
  13. }

异常处理(ExceptionHandler)

HandlerExceptionResolver

ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
SimpleMappingExceptionResolver

@ExceptionHandler

  1. /*
  2. 1. 入参 ex 即为发生异常的异常对象
  3. 2. 加@ExceptionHandler的方法不能有Map<String, Object>的入参
  4. */
  5. @Controller
  6. public class SpringMVC {
  7. @ExceptionHandler({RuntimeException.class})
  8. public ModelAndView handleException(Exception ex) {
  9. System.out.println(ex);
  10. }
  11. }

@ControllerAdvice

  1. /*
  2. 加 @ControllerAdvice 注解的类,handler发生异常时如果在本类中找不到
  3. ExceptionHandler则会到这个注解的类中找
  4. */
  5. @ControllerAdvice
  6. public class HandleExceptions {
  7. @ExceptionHandler({RuntimeException.class})
  8. public ModelAndView handleException(Exception ex) {
  9. System.out.println(ex);
  10. }
  11. }

@ResponseStatus

属性:value,reason

  1. 1. 加在自定义的异常类上
  2. @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="出异常了")
  3. public class MyException extends Exception {
  4. }
  5. 2.加在方法上(方法正常执行但是会返回错误页面)
  6. public class SpringMVC {
  7. @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="出异常了")
  8. @RequestMapping("testResponseStatus")
  9. public String testResponseStatus(@RequestParam(value="i") Integer i) {
  10. }
  11. }

SimpleMappingExceptionResolver

配置:

  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
  2. //异常在域中的名字,默认是exception
  3. <property name="exceptionAttribute" value="ex"></property>
  4. <property name="exceptionMappings">
  5. <props>
  6. //不同异常跳转不同错误界面
  7. <prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
  8. </props>
  9. </property>
  10. </bean>

SpringMVC运行流程

image.png

Spring和SpringMVC的整合

建议分开两个配置文件 spring.xml 和 springmvc.xml

为防止两个配置文件扫描的包有重合,导致创建两次对象
spring.xml :

  1. <context:component-scan base-package="com.atguigu" use-default-filters="false">
  2. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  3. <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
  4. </context:component-scan>

springmvc.xml :

  1. <context:component-scan base-package="com.atguigu" use-default-filters="false">
  2. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  3. <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
  4. </context:component-scan>