SpringMVC_Two

响应数据和结果视图

创建工厂

导坐标:

  1. <!-- 版本锁定 -->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. <spring.version>5.0.2.RELEASE</spring.version>
  7. </properties>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-web</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>javax.servlet</groupId>
  26. <artifactId>servlet-api</artifactId>
  27. <version>2.5</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>javax.servlet.jsp</groupId>
  32. <artifactId>jsp-api</artifactId>
  33. <version>2.0</version>
  34. <scope>provided</scope>
  35. </dependency>
  36. </dependencies>

配置web.xml

在web.xml配置文件中核心控制器DispatcherServlet

  1. <!-- SpringMVC的核心控制器 -->
  2. <servlet>
  3. <servlet-name>dispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc.xml</param-value>
  9. </init-param>
  10. <!-- 配置servlet启动时加载对象 -->
  11. <load-on-startup></load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>dispatcherServlet</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>

处理乱码的过滤器:

  1. <!--处理乱码的过滤器-->
  2. <filter>
  3. <filter-name>CharacterEncodingFilter</filter-name>
  4. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>UTF-8</param-value>
  8. </init-param>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>CharacterEncodingFilter</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>

配置编写springmvc.xml的配置文件

在resources下创建springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd">
  13. <!-- 1:配置spring创建容器时要扫描的包 -->
  14. <context:component-scan base-package="com.le"></context:component-scan>
  15. <!-- 2:配置视图解析器 -->
  16. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  17. <property name="prefix" value="/WEB-INF/pages/"></property>
  18. <property name="suffix" value=".jsp"></property>
  19. </bean>
  20. <!-- 3:配置spring开启注解mvc的支持 -->
  21. <mvc:annotation-driven></mvc:annotation-driven>
  22. </beans>

创建index.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. </body>
  8. </html>

在WEB-INF下创建pages的文件夹,创建success.jsp

  1. <body>
  2. <h1>访问成功</h1>
  3. </body>

返回值分类

Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

创建response.jsp

  1. <body>
  2. <h3>返回字符串</h3>
  3. <a href="user/testReturnString">返回字符串</a><br>
  4. <a href="user/userUpdate">修改用户(表单回显)</a>
  5. </body>

创建包com.le.controller,创建类UserController.java

  1. @Controller
  2. @RequestMapping(path = "/user")
  3. public class UserController {
  4. // 返回字符串
  5. @RequestMapping(path="/testReturnString")
  6. public String testReturnString(){
  7. System.out.println("执行了testReturnString方法!");
  8. return "success";
  9. }
  10. /**
  11. * 请求参数的绑定
  12. */
  13. @RequestMapping(value="/userUpdate")
  14. public String userUpdate(Model model) {
  15. // 模拟从数据库中查询的数据,在页面上进行回显
  16. User user = new User();
  17. user.setUsername("张三");
  18. user.setPassword("123");
  19. user.setAge();
  20. model.addAttribute("user", user);
  21. return "update";
  22. }
  23. }

在WEB-INF的pages下,编写update.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h3>修改用户</h3>
  8. ${ requestScope }
  9. <form action="${pageContext.request.contextPath}/
  10. user/update" method="post">
  11. 姓名:<input type="text" name="username" value="${ user.username }"><br>
  12. 密码:<input type="text" name="password" value="${ user.password }"><br>
  13. 年龄:<input type="text" name="age" value="${ user.age }"><br>
  14. <input type="submit" value="提交">
  15. </form>
  16. </body>
  17. </html>

点击“提交”

  1. // 更新保存
  2. @RequestMapping(value = "/update")
  3. public String update(User user){
  4. System.out.println("执行UserController的update的方法!user:"+user);
  5. return "success";
  6. }

返回值是void

情况1:如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。

默认会跳转到@RequestMapping(path="/testVoid")testVoid的页面。

response.jsp

  1. <h3>无返回值void</h3>
  2. <a href="user/testVoid">无返回值</a>

userController.java

  1. // 无返回值
  2. @RequestMapping(path="/testVoid")
  3. public void testVoid(){
  4. System.out.println("执行了testVoid方法!");
  5. }

情况2:可以使用请求转发或者重定向跳转到指定的页面

修改testVoid的方法

  1. @RequestMapping(value="/testVoid")
  2. public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
  3. System.out.println("请求转发或者重定向");
  4. // 1:请求转发
  5. // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
  6. // 2:重定向
  7. // response.sendRedirect(request.getContextPath()+"/index.jsp");
  8. response.setCharacterEncoding("UTF-8");
  9. response.setContentType("text/html;charset=UTF-8");
  10. // 3:直接响应数据
  11. response.getWriter().print("你好");
  12. return;
  13. }

页面结果:

情况3:如果不指定转发和重定向,直接响应数据。


返回值是ModelAndView对象

ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图

具体的代码如下

response.jsp

  1. <h3>返回ModelAndView对象</h3>
  2. <a href="user/testModelAndView">ModelAndView</a>

修改Usercontroller.java

  1. /**
  2. * 返回ModelAndView对象
  3. * 可以传入视图的名称(即跳转的页面),还可以传入对象。
  4. * @return
  5. * @throws Exception
  6. */
  7. @RequestMapping(value="/testModelAndView")
  8. public ModelAndView testModelAndView() throws Exception {
  9. ModelAndView mv = new ModelAndView();
  10. // 默认执行视图解析器,跳转到WEB-INF/pages/success.jsp的页面
  11. mv.setViewName("success");
  12. // 模拟从数据库中查询所有的用户信息
  13. List<User> list = new ArrayList<>();
  14. User user1 = new User();
  15. user1.setUsername("张三");
  16. user1.setPassword("123");
  17. User user2 = new User();
  18. user2.setUsername("赵四");
  19. user2.setPassword("456");
  20. list.add(user1);
  21. list.add(user2);
  22. // 添加对象
  23. mv.addObject("list", list);
  24. return mv;
  25. }

坐标:

  1. <dependency>
  2. <groupId>jstl</groupId>
  3. <artifactId>jstl</artifactId>
  4. <version>1.2</version>
  5. </dependency>

success.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>访问成功</h1>
  9. <h3>查询所有的数据</h3>
  10. <c:forEach items="${ list }" var="user">
  11. ${ user.username }-----${user.password}<br>
  12. </c:forEach>
  13. </body>
  14. </html>

SpringMVC框架提供的转发和重定向

forward请求转发

UserController.java方法返回String类型,想进行请求转发也可以编写成:

response.jsp

  1. <h3>转发和重定向</h3>
  2. <a href="user/testForwardOrRedirect">ForwardOrRedirect</a>

转发和重定向

  1. /**
  2. * 使用forward关键字进行请求转发
  3. * "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
  4. * @return
  5. * @throws Exception
  6. */
  7. @RequestMapping("/testForwardOrRedirect")
  8. public String testForwardOrRedirect() throws Exception {
  9. System.out.println("testForwardOrRedirect方法执行了...");
  10. // return "forward:/WEB-INF/pages/success.jsp";
  11. return "forward:/user/testReturnString";
  12. }

redirect重定向

controller方法返回String类型,想进行重定向也可以编写成

  1. /**
  2. * 重定向
  3. * @return
  4. * @throws Exception
  5. */
  6. @RequestMapping("/testForwardOrRedirect")
  7. public String testForwardOrRedirect() throws Exception {
  8. System.out.println("testForwardOrRedirect方法执行了...");
  9. // return "redirect:/index.jsp";
  10. return "redirect:/user/testReturnString";
  11. }

@ResponseBody响应json数据

去掉对静态资源的拦截

DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。

response.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <script src="js/jquery.min.js"></script>
  3. <script>
  4. $(function(){
  5. $("#btn").click(function(){
  6. alert("ok");
  7. })
  8. })
  9. </script>
  10. <html>
  11. <head>
  12. <title>Title</title>
  13. </head>
  14. <body>
  15. <h3>ResponseBody响应json数据</h3>
  16. <input type="button" value="提交" id="btn"/>
  17. </body>
  18. </html>

此时发现【提交】按钮不起作用,因为springMVC的使用了servlet的配置,servlet中使用/,拦截所有的请求,js/jquery.min.js也被拦截了,不起作用。

【解决方案】:需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置

推荐使用:在springmvc.xml中使用:

  1. <!--去掉所有的静态资源,让DispatchServlet不能拦截静态资源-->
  2. <!--方案一-->
  3. <mvc:default-servlet-handler></mvc:default-servlet-handler>

使用@RequestBody获取请求的数据

response.jsp

  1. <script>
  2. $(function(){
  3. $("#btn").click(function(){
  4. // alert("ok");
  5. $.ajax({
  6. url:"user/testJson",
  7. contentType:"application/json;charset=UTF-8",
  8. data:'{"username":"tom","password":"123","age":30}',
  9. dataType:"json",
  10. type:"post",
  11. success:function(data){
  12. alert(data);
  13. alert(data.addressName);
  14. }
  15. });
  16. })
  17. })
  18. </script>

UserController.java

  1. /**
  2. * 获取请求体的数据
  3. * @param body
  4. */
  5. @RequestMapping("/testJson")
  6. public void testJson(@RequestBody String body) {
  7. System.out.println(body);
  8. }


但是此时获取了json数据的字符串,我们需要将数据封装到javaBean的对象怎么办?

↓↓↓↓↓↓↓

json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.fasterxml.jackson.core</groupId>
  8. <artifactId>jackson-core</artifactId>
  9. <version>2.9.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.fasterxml.jackson.core</groupId>
  13. <artifactId>jackson-annotations</artifactId>
  14. <version>2.9.0</version>
  15. </dependency>

使用@ResponseBody注解将JavaBean对象转换成Json返回

使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应 
要求方法需要返回JavaBean的对象

response.jsp

  1. <script src="js/jquery.min.js"></script>
  2. <script>
  3. $(function(){
  4. $("#btn").click(function(){
  5. // alert("ok");
  6. $.ajax({
  7. url:"user/testJson",
  8. contentType:"application/json;charset=UTF-8",
  9. data:'{"username":"tom","password":"123","age":30}',
  10. dataType:"json",
  11. type:"post",
  12. success:function(data){
  13. alert(data);
  14. alert(data.username);
  15. alert(data.password);
  16. alert(data.age);
  17. }
  18. });
  19. })
  20. })
  21. </script>

注意:data:'{"username":"tom","password":"123","age":30}',一定保证单引号在外,双引号在里,否则抛出异常

UserController.java

  1. /**
  2. * 获取请求体的数据,响应数据Json
  3. * @param body
  4. */
  5. @RequestMapping("/testJson")
  6. public @ResponseBody User testJson(@RequestBody User user) {
  7. // 请求user
  8. System.out.println(user);
  9. // 响应u
  10. User u = new User();
  11. u.setUsername("张三");
  12. u.setPassword("123");
  13. u.setAge();
  14. return u;
  15. }

SpringMVC实现文件上传

文件上传的必要前提:

  • A form表单的enctype取值必须是:multipart/form-data (支持二进制数据) 
    (默认值是:application/x-www-form-urlencoded) (支持传递参数,例如:?username=zhangsan&age=18) 
    enctype:是表单请求正文的类型
  • B method属性取值必须是Post
  • C 提供一个文件选择域

文件上传的原理分析 :

​ 当form表单的enctype取值不是默认值后(例如:multipart/form-data),request.getParameter()将失效。

默认值:

enctype=”application/x-www-form-urlencoded”时,form表单的正文内容是:

key=value&key=value&key=value

当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成: 每一部分都是MIME类型描述的正文

  1. -----------------------------7de1a433602ac 分界符
  2. Content-Disposition: form-data; name="userName" 协议头
  3. aaa 协议的正文
  4. -----------------------------7de1a433602ac
  5. Content-Disposition: form-data; name="file"; filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
  6. Content-Type: text/plain 协议的类型(MIME类型)
  7. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  8. -----------------------------7de1a433602ac--

springmvc传统方式的文件上传

坐标:

  1. <!-- 版本锁定 -->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. <spring.version>5.0.2.RELEASE</spring.version>
  7. </properties>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-web</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>javax.servlet</groupId>
  26. <artifactId>servlet-api</artifactId>
  27. <version>2.5</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>javax.servlet.jsp</groupId>
  32. <artifactId>jsp-api</artifactId>
  33. <version>2.0</version>
  34. <scope>provided</scope>
  35. </dependency>
  36. <dependency>
  37. <groupId>jstl</groupId>
  38. <artifactId>jstl</artifactId>
  39. <version>1.2</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>commons-fileupload</groupId>
  43. <artifactId>commons-fileupload</artifactId>
  44. <version>1.3.1</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>commons-io</groupId>
  48. <artifactId>commons-io</artifactId>
  49. <version>2.4</version>
  50. </dependency>
  51. </dependencies>

web.xml

  1. <!-- SpringMVC的核心控制器 -->
  2. <servlet>
  3. <servlet-name>dispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc.xml</param-value>
  9. </init-param>
  10. <!-- 配置servlet启动时加载对象 -->
  11. <load-on-startup></load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>dispatcherServlet</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>
  17. <!--配置解决中文乱码过滤器-->
  18. <filter>
  19. <filter-name>characterEncodingFilter</filter-name>
  20. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  21. <init-param>
  22. <param-name>encoding</param-name>
  23. <param-value>utf-8</param-value>
  24. </init-param>
  25. </filter>
  26. <filter-mapping>
  27. <filter-name>characterEncodingFilter</filter-name>
  28. <url-pattern>/*</url-pattern>
  29. </filter-mapping>

springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd">
  13. <context:component-scan base-package="com.le.controller"/>
  14. <!--视图解析器-->
  15. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/pages/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <mvc:annotation-driven></mvc:annotation-driven>
  20. <!-- 设置静态资源不过滤 -->
  21. <mvc:default-servlet-handler></mvc:default-servlet-handler>
  22. </beans>

导入index.jsp

  1. <body>
  2. <a href="user/testFileUpload">文件上传</a>
  3. </body>

UserController.java

  1. @Controller
  2. @RequestMapping(path = "/user")
  3. public class UserController {
  4. // 文件上传
  5. @RequestMapping(path="/testFileUpload")
  6. public String testFileUpload(){
  7. System.out.println("执行了testFileUpload方法!");
  8. return "success";
  9. }
  10. }

WEB-INF/pages/success.jsp

  1. <body>
  2. <h1>文件上传成功</h1>
  3. </body>

普通文件上传

index.jsp

  1. <%--
  2. enctype="multipart/form-data"把请求体分成多个部分上传
  3. --%>
  4. <form action="user/testFileUpload1" method="post" enctype="multipart/form-data">
  5. 选择文件:<input type="file" name="upload"><br/>
  6. <input type="submit" value="上传"/><br/>
  7. </form>

UserController.java

  1. // 文件上传
  2. @RequestMapping(path="/testFileUpload1")
  3. public String testFileUpload1(HttpServletRequest request) throws Exception {
  4. System.out.println("执行了testFileUpload1方法!");
  5. // 上传的位置,获取到项目根目录下的uploads文件夹绝对路径
  6. String path = request.getSession().getServletContext().getRealPath("/uploads");
  7. // 创建file对象
  8. File file = new File(path);
  9. // 判断是否存在
  10. if(!file.exists()) {
  11. // 创建目录
  12. file.mkdirs();
  13. }
  14. // 创建磁盘文件项工厂
  15. DiskFileItemFactory factory = new DiskFileItemFactory();
  16. ServletFileUpload fileUpload = new ServletFileUpload(factory);
  17. // 解析request
  18. List<FileItem> list = fileUpload.parseRequest(request);
  19. // 遍历,获取到每一个文件项的对象
  20. for (FileItem fileItem : list) {
  21. // 判断,当前fileItem是否是文件项
  22. if(fileItem.isFormField()) {
  23. // 说明是普通的表单 ,文本框
  24. }else {
  25. // 文件上传项 fileItem
  26. // 获取到文件的名称
  27. String filename = fileItem.getName();
  28. // 生成唯一标识
  29. String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
  30. filename = uuid+"_"+filename;
  31. // 上传文件
  32. fileItem.write(new File(file, filename));
  33. // 删除临时文件
  34. fileItem.delete();
  35. }
  36. }
  37. return "success";
  38. }

查看上传结果


SpringMVC传统方式文件上传

简化ServletFileUpload的写法。

SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。

springmvc.xml中配置

  1. <!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!--文件大小限制:10*1024*1024字节,表示10M-->
  4. <property name="maxUploadSize" value="10485760"/>
  5. </bean>

index.jsp

  1. <hr>
  2. <form action="user/testFileUpload2" method="post" enctype="multipart/form-data">
  3. 选择文件:<input type="file" name="upload"><br/>
  4. <input type="submit" value="上传"/><br/>
  5. </form>

UserController.java

  1. /**
  2. * 使用的是SpringMVC的文件上传
  3. * 框架提供了一个类,表示上传文件的对象,底层已经帮你解析了request对象,把文件上传对象通过方法的参数传递进来
  4. *
  5. * MultipartFile upload 变量名称必须和表单file标签的name属性名称相同,上传文件的对象,SpringMVC框架传递给你的。
  6. *
  7. * @param request
  8. * @return
  9. * @throws Exception
  10. */
  11. @RequestMapping("/testFileUpload2")// ↓↓↓注意这里的参数名称需要和文件上传表单中的"name属性名称一致
  12. public String testFileUpload2(HttpServletRequest request,MultipartFile upload) throws Exception {
  13. System.out.println("SpringMVC的上传文件...");
  14. // 上传的位置,获取到项目根目录下的uploads文件夹绝对路径
  15. String path = request.getSession().getServletContext().getRealPath("/uploads");
  16. // 创建file对象
  17. File file = new File(path);
  18. // 判断是否存在
  19. if(!file.exists()) {
  20. // 创建目录
  21. file.mkdirs();
  22. }
  23. // 获取到文件的名称
  24. String filename = upload.getOriginalFilename();
  25. // 生成唯一标识
  26. String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
  27. filename = uuid+"_"+filename;
  28. // 使用upload对象中方法就直接上传文件
  29. upload.transferTo(new File(file, filename));
  30. return "success";
  31. }

springmvc跨服务器方式的文件上传

分服务器的目的

在实际开发中,我们会有很多处理不同功能的服务器。例如:

应用服务器:负责部署我们的应用 (源码)

数据库服务器:运行我们的数据库

缓存和消息服务器:负责处理大并发访问的缓存和消息

文件服务器:负责存储用户上传文件的服务器。

图片服务器:负责存储用户上传的图片的信息。

(注意:此处说的不是服务器集群)

分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

准备两个tomcat服务器,并创建一个用于存放图片的web工程

创建工程

选择项目,右键,new一个Module

创建2个tomcat服务器

一个应用服务器:用来启动springmvc_day02_fileupload(端口:8080)

另一个图片服务器:用来启动springmvc_day02_fileuploadserver(端口:9090)

两个服务器的端口需要不一致

同时在图片服务器上创建upload文件夹,用来指定上传的文件。

注意:这里要新建一个任意文件,不然可能会报错

坐标

  1. <dependency>
  2. <groupId>commons-fileupload</groupId>
  3. <artifactId>commons-fileupload</artifactId>
  4. <version>1.3.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-io</groupId>
  8. <artifactId>commons-io</artifactId>
  9. <version>2.4</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.sun.jersey</groupId>
  13. <artifactId>jersey-core</artifactId>
  14. <version>1.18.1</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.sun.jersey</groupId>
  18. <artifactId>jersey-client</artifactId>
  19. <version>1.18.1</version>
  20. </dependency>

index.jsp

  1. <hr>
  2. <form action="user/testFileUpload3" method="post" enctype="multipart/form-data">
  3. 选择文件:<input type="file" name="upload"><br/>
  4. <input type="submit" value="上传"/><br/>
  5. </form>

UserController.java

  1. /**
  2. * 跨服务器上传文件,把文件上传到图片服务器中去
  3. * @param upload
  4. * @return
  5. * @throws Exception
  6. */
  7. @RequestMapping("/testFileUpload3")
  8. public String testFileUpload3(MultipartFile upload) throws Exception {
  9. System.out.println("跨服务器上传文件...");
  10. // 指定上传文件的路径
  11. String path = "http://localhost:9090/springmvc_day02_fileuploadserver/uploads/";
  12. // 获取到文件的名称
  13. String filename = upload.getOriginalFilename();
  14. // 生成唯一标识
  15. String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
  16. filename = uuid+"_"+filename;
  17. // 上传文件
  18. // 创建客户端对象
  19. Client client = Client.create();
  20. filename = path+filename;
  21. // 连接图片服务器
  22. WebResource webResource = client.resource(filename);
  23. // 把文件上传到图片服务器上
  24. webResource.put(upload.getBytes());
  25. return "success";
  26. }

可在success.jsp中,显示上传的图片

  1. <body>
  2. ${pageContext.request.contextPath}
  3. <h1>访问成功!</h1>
  4. <img src="http://localhost:8088/springmvc_day02_fileuploadserver/upload/D7E35E6EDAC94039BDE6533BEFF8F981_02.jpg"/>
  5. </body>

注意:如果抛出异常:returned a response status of 403 Forbidden

出现这个错误的原因是因为我将图片上传单独部署了一个服务器。但是图片不能写入。需要在这个存储图片的项目所在的tomcat中配置可写操作。具体的是在Tomcat目录下的conf文件夹下的web.xml中加入 
加入此行的含义是:接收文件的目标服务器可以支持写入操作。

  1. <servlet>
  2. <servlet-name>default</servlet-name>
  3. <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  4. <init-param>
  5. <param-name>debug</param-name>
  6. <param-value></param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>readonly</param-name>
  10. <param-value>false</param-value>
  11. </init-param>
  12. <init-param>
  13. <param-name>listings</param-name>
  14. <param-value>false</param-value>
  15. </init-param>
  16. <load-on-startup></load-on-startup>
  17. </servlet>

SpringMVC的异常处理

异常处理思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理

SpringMVC的异常处理

坐标

  1. <!-- 版本锁定 -->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. <spring.version>5.0.2.RELEASE</spring.version>
  7. </properties>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-web</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>javax.servlet</groupId>
  26. <artifactId>servlet-api</artifactId>
  27. <version>2.5</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>javax.servlet.jsp</groupId>
  32. <artifactId>jsp-api</artifactId>
  33. <version>2.0</version>
  34. <scope>provided</scope>
  35. </dependency>
  36. <dependency>
  37. <groupId>jstl</groupId>
  38. <artifactId>jstl</artifactId>
  39. <version>1.2</version>
  40. </dependency>
  41. </dependencies>

web.xml

  1. <!-- SpringMVC的核心控制器 -->
  2. <servlet>
  3. <servlet-name>dispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc.xml</param-value>
  9. </init-param>
  10. <!-- 配置servlet启动时加载对象 -->
  11. <load-on-startup></load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>dispatcherServlet</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>
  17. <!--配置解决中文乱码过滤器-->
  18. <filter>
  19. <filter-name>characterEncodingFilter</filter-name>
  20. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  21. <init-param>
  22. <param-name>encoding</param-name>
  23. <param-value>utf-8</param-value>
  24. </init-param>
  25. </filter>
  26. <filter-mapping>
  27. <filter-name>characterEncodingFilter</filter-name>
  28. <url-pattern>/*</url-pattern>
  29. </filter-mapping>

springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd">
  13. <context:component-scan base-package="com.le.controller"/>
  14. <!--视图解析器-->
  15. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/pages/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <mvc:annotation-driven></mvc:annotation-driven>
  20. <!-- 设置静态资源不过滤 -->
  21. <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
  22. <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
  23. <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
  24. </beans>

导入index.jsp

  1. <body>
  2. <a href="user/testException">异常处理</a>
  3. </body>

UserController.java

  1. @Controller
  2. @RequestMapping(path = "/user")
  3. public class UserController {
  4. // 自定义异常处理
  5. @RequestMapping(path="/testException")
  6. public String testException(){
  7. System.out.println("执行了testException方法!");
  8. int a = /;
  9. return "success";
  10. }
  11. }

WEB-INF/pages/success.jsp

  1. <body>
  2. <h1>访问成功!</h1>
  3. </body>


自定义异常类

创建包com.le.exception,创建类SysException.java。

  1. /**
  2. * 自定义异常类
  3. */
  4. public class SysException extends Exception {
  5. // 异常提示信息
  6. private String message;
  7. public String getMessage() {
  8. return message;
  9. }
  10. public void setMessage(String message) {
  11. this.message = message;
  12. }
  13. public SysException(String message) {
  14. this.message = message;
  15. }
  16. }

编写异常处理器

创建包com.le.exception,创建类SysExceptionResolver.java。

  1. /**
  2. * 编写异常处理器
  3. */
  4. public class SysExceptionResolver implements HandlerExceptionResolver {
  5. /**
  6. * 跳转到具体的错误页面的方法
  7. */
  8. @Override
  9. public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @Nullable Object o, Exception e) {
  10. e.printStackTrace();
  11. SysException se = null;
  12. // 获取到异常对象
  13. if(e instanceof SysException) {
  14. se = (SysException) e;
  15. }else {
  16. se = new SysException("请联系管理员");
  17. }
  18. ModelAndView mv = new ModelAndView();
  19. // 存入错误的提示信息
  20. mv.addObject("message", se.getMessage());
  21. // 跳转的Jsp页面
  22. mv.setViewName("error");// 跳转到WEB-INF/pages/error.jsp
  23. return mv;
  24. }
  25. }

配置异常处理器(跳转到错误提示页面)

springmvc.xml

  1. <!-- 配置异常处理器 -->
  2. <bean id="sysExceptionResolver" class="com.le.exception.SysExceptionResolver"/>

修改UserController.java

  1. // 自定义异常处理
  2. @RequestMapping(path="/testException")
  3. public String testException() throws SysException{
  4. System.out.println("执行了testException方法!");
  5. try {
  6. int a = /;
  7. } catch (Exception e) {
  8. // 在控制台打印
  9. e.printStackTrace();
  10. throw new SysException("服务器繁忙,稍后再试...");
  11. }
  12. return "success";
  13. }

指定error.jsp错误页面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>访问失败</h1>
  8. ${message}<br>
  9. </body>
  10. </html>

SpringMVC中的拦截器

拦截器的作用

Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器(Controller)进行预处理和后处理。

用户可以自己定义一些拦截器来实现特定的功能(权限控制、日志处理等)。

谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但是也有区别,接下来我们就来说说他们的区别:

过滤器和拦截器的区别:

区别1:

过滤器是servlet规范中的一部分,任何java web工程都可以使用。

拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

区别2:

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法(只会拦截Controller)

核心控制器设置成/,表示拦截所有请求

核心控制器设置成.do(.action),表示拦截.do结尾的url请求

要求必须实现:HandlerInterceptor接口。


自定义拦截器

坐标

  1. <!-- 版本锁定 -->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. <spring.version>5.0.2.RELEASE</spring.version>
  7. </properties>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-web</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>javax.servlet</groupId>
  26. <artifactId>servlet-api</artifactId>
  27. <version>2.5</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>javax.servlet.jsp</groupId>
  32. <artifactId>jsp-api</artifactId>
  33. <version>2.0</version>
  34. <scope>provided</scope>
  35. </dependency>
  36. <dependency>
  37. <groupId>jstl</groupId>
  38. <artifactId>jstl</artifactId>
  39. <version>1.2</version>
  40. </dependency>
  41. </dependencies>

web.xml

  1. <!-- SpringMVC的核心控制器 -->
  2. <servlet>
  3. <servlet-name>dispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc.xml</param-value>
  9. </init-param>
  10. <!-- 配置servlet启动时加载对象 -->
  11. <load-on-startup></load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>dispatcherServlet</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>
  17. <!--配置解决中文乱码过滤器-->
  18. <filter>
  19. <filter-name>characterEncodingFilter</filter-name>
  20. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  21. <init-param>
  22. <param-name>encoding</param-name>
  23. <param-value>utf-8</param-value>
  24. </init-param>
  25. </filter>
  26. <filter-mapping>
  27. <filter-name>characterEncodingFilter</filter-name>
  28. <url-pattern>/*</url-pattern>
  29. </filter-mapping>

springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context.xsd">
  13. <context:component-scan base-package="com.le.controller"/>
  14. <!--视图解析器-->
  15. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/pages/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <mvc:annotation-driven></mvc:annotation-driven>
  20. <!-- 设置静态资源不过滤 -->
  21. <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
  22. <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
  23. <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
  24. </beans>

UserController.java

  1. @Controller
  2. @RequestMapping(path = "/user")
  3. public class UserController {
  4. // 自定义拦截器
  5. @RequestMapping(path="/testInterceptor")
  6. public String testInterceptor(){
  7. System.out.println("执行了testInterceptor方法!");
  8. return "success";
  9. }
  10. }

index.jsp

  1. <body>
  2. <a href="user/testInterceptor">自定义拦截器</a>
  3. </body>

WEB-INF/pages/success.jsp

  1. <body>
  2. <h1>访问成功</h1>
  3. </body>

自定义拦截器

创建包com.le.interceptor,创建类MyInterceptor1.java,实现HandlerInterceptor接口

  1. public class MyInterceptor1 implements HandlerInterceptor{
  2. /**
  3. * controller方法执行前,进行拦截的方法
  4. * return true放行
  5. * return false拦截
  6. * 可以使用转发或者重定向直接跳转到指定的页面。
  7. */
  8. @Override
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println("访问Controller类之前执行...");
  11. return true;
  12. }
  13. }

配置拦截器类

在springmvc.xml中配置拦截器类

  1. <!--配置拦截器类-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!-- 哪些方法进行拦截 -->
  5. <mvc:mapping path="/user/*"/>
  6. <!--哪些方法不进行拦截-->
  7. <!--<mvc:exclude-mapping path="/user/save"/>-->
  8. <!-- 注册拦截器对象 -->
  9. <bean class="com.le.interceptor.MyInterceptor1"></bean>
  10. </mvc:interceptor>
  11. </mvc:interceptors>

在success.jsp中添加:

  1. <body>
  2. <h1>访问成功</h1>
  3. <%
  4. System.out.println("浏览器success.jsp执行...");
  5. %>
  6. </body>


HandlerInterceptor接口中的方法

1:preHandle方法是controller方法执行前拦截的方法

​ 可以使用request或者response跳转到指定的页面

​ return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

​ return false不放行,不会执行controller中的方法。

2:postHandle是controller方法执行后执行的方法,在JSP视图执行前。

​ 可以使用request或者response跳转到指定的页面

​ 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

3:afterCompletion方法是在JSP执行后执行(用的不多)

​ request或者response不能再跳转页面了,否则抛出异常。

修改:MyInterceptor.java

  1. public class MyInterceptor1 implements HandlerInterceptor{
  2. /**
  3. * controller方法执行前,进行拦截的方法(预处理)
  4. * return true放行
  5. * return false拦截
  6. * 可以使用转发或者重定向直接跳转到指定的页面。
  7. */
  8. @Override
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println("MyInterceptor1访问Controller类之前执行...");
  11. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
  12. return true;
  13. }
  14. /**
  15. * controller方法执行后,进行拦截的方法(后处理),success.jsp执行之前
  16. * 可以使用转发或者重定向直接跳转到指定的页面。
  17. */
  18. @Override
  19. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
  20. System.out.println("MyInterceptor1访问Controller类之后执行...");
  21. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
  22. }
  23. /**
  24. * success.jsp执行之后,该方法执行(终处理)
  25. */
  26. @Override
  27. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  28. System.out.println("MyInterceptor1访问success.jsp之后...");
  29. }
  30. }


配置多个拦截器

再编写一个拦截器的类MyInterceptor2.java

  1. public class MyInterceptor2 implements HandlerInterceptor{
  2. /**
  3. * controller方法执行前,进行拦截的方法(预处理)
  4. * return true放行
  5. * return false拦截
  6. * 可以使用转发或者重定向直接跳转到指定的页面。
  7. */
  8. @Override
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println("MyInterceptor2访问Controller类之前执行...");
  11. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
  12. return true;
  13. }
  14. /**
  15. * controller方法执行后,进行拦截的方法(后处理),success.jsp执行之前
  16. * 可以使用转发或者重定向直接跳转到指定的页面。
  17. */
  18. @Override
  19. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
  20. System.out.println("MyInterceptor2访问Controller类之后执行...");
  21. // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
  22. }
  23. /**
  24. * success.jsp执行之后,该方法执行(终处理)
  25. */
  26. @Override
  27. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  28. System.out.println("MyInterceptor2访问success.jsp之后...");
  29. }
  30. }

配置2个拦截器

  1. <!--配置拦截器类-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!-- 哪些方法进行拦截 -->
  5. <mvc:mapping path="/user/*"/>
  6. <!--哪些方法不进行拦截-->
  7. <!--<mvc:exclude-mapping path="/user/save"/>-->
  8. <!-- 注册拦截器对象 -->
  9. <bean class="com.le.interceptor.MyInterceptor1"></bean>
  10. </mvc:interceptor>
  11. <mvc:interceptor>
  12. <!-- 哪些方法进行拦截 -->
  13. <mvc:mapping path="/**"/>
  14. <!--哪些方法不进行拦截-->
  15. <!--<mvc:exclude-mapping path="/user/save"/>-->
  16. <!-- 注册拦截器对象 -->
  17. <bean class="com.le.interceptor.MyInterceptor2"></bean>
  18. </mvc:interceptor>
  19. </mvc:interceptors>

使用拦截器处理“权限控制”,例如,存在session就能访问Controller,不存在session不能访问Controller

SpringMVC_Two的更多相关文章

随机推荐

  1. 可视化利器 —— t-SNE(matlab toolbox 的使用与解释)

    t-SNE – Laurens van der Maaten(感谢学术男神们的无私开源) User_guide.pdf(用户指南) 1. tsne 函数 mappedX = tsne(X, label ...

  2. Qt Installer Framework 3.0.1 Released(功能比较强)

    We are happy to announce the release of Qt IFW 3.0.1. 3.0.1 is fully compatible with 2.0.5, which me ...

  3. 短暂聊天VS温馨提示

    介绍 作为一个合作格该程序猿,使用的开发工具的熟练使用是我们必须掌握的. 而作为一名优秀的程序猿.我们不仅要能熟练的使用.并且还要去高效的使用. 而作为.Net平台专门定制的开发工具VS那当然是我们必 ...

  4. 如何完全备份android在系统system分区和data分

    安德鲁斯系统备份是非常的情况下,可以使用.下面的这个python脚本.它可以用来备份整个data分:所有data分区的文件和文件夹打包data.zip.并产生recovery专用edify脚本upda ...

  5. 关于JSON 字段数据的直接查询

    最新的pgSQL 对json的支持在进一步加强!虽然我也学了那么点皮毛,但是json数据对于WEB的开发确实很重要,苦苦学习了很长一段时间,不断的关系PGSQL的动向! 好在翻看很多高人的例子和介绍, ...

  6. XF 列表视图事件

    <?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http:// ...

  7. 最简单的IdentityServer实现——Api

    1.创建项目并添加引用 创建ASP.NET Core Web API项目IdentityServer.EasyDemo.Api   1   2 引用IdentityServer4.AccessToke ...

  8. 梧桐那时雨http://blog.csdn.net/fuchaosz/article/details/51882935?readlog

    Ubuntu 16.04 一系列软件安装命令,包括QQ.搜狗.Chrome.vlc.网易云音乐安装方法 原创 2016年07月20日 11:44:01 标签: ubuntu 27024 1 简介 Ub ...

  9. LINQ学习笔记(二)

    上一篇是根据百度百科写的随便,同时也纠正我对LINQ的看法,因为首次接触LINQ是使用EF对数据库数据的操作. 所以误以为它操作数据库的一种新手段. LINQ语言集成查询是一组技术的名称,这些技术建立 ...

  10. excel导入到数据库的异常处理

    excel导入到数据库,这个是经常发生的,今天就碰到了一个非常郁闷的事情,在导入到oracle数据的时候,总是出现ORA-01756: 引号内的字符串没有正确结束,认真的排插了数据当中可能出现的错误, ...