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. OpenGL(十五) OpenCV+OpenGL实现水面倒影

    有两幅原始图片,一个是景物图像,一个是水面图像,尝试生成景物在水中的倒影: 在OpenGL中,加载并显示这个景物图像可以把这个图像作为纹理载入即可,把图像直接选择180度的效果就相当于是在镜面中倒影的 ...

  2. windows安装Oracle10G

     1.解压文件10201_database_win32.zip.并双击解压文件夹下的setup.exe,出现安装界面,例如以下: 输入口令和确认口令.如:password,点击下一步,出现例如以下 ...

  3. 【转载】Docker 安装 Nginx 并个性化挂载配置文件 nginx.conf

    首先,系统(3.8以上内核的linux)中安装好 Docker 这个运用程序.由于网络原因,我们下载一个Docker官方的镜像需要很长的时间,甚至下载失败.为此,阿里云容器镜像服务提供了官方的镜像站点 ...

  4. 如何清除XP的网络共享密码

    一.利用NET命令 我们知道在Windows XP中提供了“net user”命令,该命令可以添加.修改用户账户信息,其语法格式为: net user [UserName [Password | *] ...

  5. 【shell】编译脚本

    #!/bin/bash #设置环境变量 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/ ...

  6. 苹果ios用js的Date()出现NaN问题解决办法

    原文:苹果ios用js的Date()出现NaN问题解决办法 ios使用如下方法获得NaN,安卓手机则是正常计算,解决方法是换个这个时间的格式 new Date("2017-04-28 23: ...

  7. UWP-消息提示(仿Android)

    原文:UWP-消息提示(仿Android) 在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那 ...

  8. Android零基础入门第63节:过时但仍值得学习的选项卡TabHost

    原文:Android零基础入门第63节:过时但仍值得学习的选项卡TabHost 由于前几天参加一个学习培训活动,几乎每天都要从早晨7点到晚上一两点,没有什么时间来分享,实在抱歉中间断更了几天.从今天开 ...

  9. Android零基础入门第62节:搜索框组件SearchView

    原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当 ...

  10. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...