SpringMVC:

  • controller:控制器
    • 获得表单数据
    • 调用业务逻辑
    • 转向指定页面
  • model:模型
    • 业务逻辑
    • 保存数据的状态
  • view:视图
    • 显示页面

SpringMVC优点:

  • 轻量级,简单易学
  • 高效,基于请求响应的MVC框架
  • 与 Spring 兼容性好,无缝集成
  • 约定优于配置
  • 功能强大:restful,数据验证,格式化等
  • 将业务逻辑,数据,显示分离,降低各个模块之间的耦合,

Spring的web框架围绕DispatcherServlet调度Servlet设计。

HelloSpringMVC项目搭建,pom.xml中导入spring-webmvc,servlet-api,jstl-api,jstl的jar包

web.xml

  1. <!--注册DispatcherServlet-->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!--关联一个springmvc的配置文件-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc-servlet.xml</param-value>
  9. </init-param>
  10. <!--启动级别-->
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <!-- / 匹配所有的请求 (不包括.jsp)-->
  14. <!-- /* 匹配所有的请求 (包括.jsp)-->
  15. <servlet-mapping>
  16. <servlet-name>springmvc</servlet-name>
  17. <url-pattern>/</url-pattern>
  18. </servlet-mapping>

springmvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  7. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  8. <!--视图解析器,DispatcherServlet给它的ModelAndView-->
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
  10. <!--前缀-->
  11. <property name="prefix" value="/WEB-INF/jsp/"/>
  12. <!--后缀-->
  13. <property name="suffix" value=".jsp"/>
  14. </bean>
  15. <!--Handler-->
  16. <bean id="/hello" class="com.zr.controller.HelloController"/>
  17. </beans>

HelloController

  1. //注意:导入org.springframework.web.servlet.mvc.Controller;
  2. public class HelloController implements Controller {
  3. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. //模型和视图
  5. ModelAndView mv = new ModelAndView();
  6. //封装对象,放在ModelAndView中
  7. mv.addObject("msg","HelloSpringMVC!");
  8. //封装要跳转的视图
  9. mv.setViewName("hello"); ///WEB-INF/jsp/hello.jsp
  10. return mv;
  11. }
  12. }

hello.jsp

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

注意:如果访问http://localhost:8080/hello出现404

选中自己的项目名,在WEB-INF下新建lib文件夹,点击+号,将项目的依赖添加到lib中,重启项目!!!

  1. DispatcherServlet表示前置控制器,是整个SpringMVC控制的中心,用户发出请求,DispatcherServlet接收请求并拦截请求。
  2. HandlerMapping为处理器映射器,根据处理器请求url查找Handler,由DispatcherServlet调用。
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,按特定的规则执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将执行的信息返回给HandlerAdapter,如ModelAndView。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. 视图渲染呈现给用户。

控制器Controller

  • 控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方式实现。

  • 控制器负责解析用户的请求并将其转化为一个模型。

  • 在SpringMVC中一个控制器类可以包含多个方法。

web.xml

  1. <!-- 配置DispatcherServlet:这是SpringMVC的核心,请求分发器,前端控制器 -->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 绑定spring的配置文件-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc-servlet.xml</param-value>
  9. </init-param>
  10. <!-- 启动级别-->
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <!--SpringMVC中:
  14. /:匹配所有的请求。不匹配jsp页面
  15. /*:匹配所有的请求。匹配jsp页面
  16. -->
  17. <servlet-mapping>
  18. <servlet-name>springmvc</servlet-name>
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>

springmvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!--自动扫描包,让包下的注解生效,由IOC容器统一管理-->
  13. <context:component-scan base-package="com.zr.controller"/>
  14. <!--让SpringMVC不处理静态资源-->
  15. <mvc:default-servlet-handler/>
  16. <!--支持注解驱动
  17. 在spring中使用@RequestMapping注解来完成映射关系,必须注册
  18. DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
  19. 这两个实例分别在类级别和方法级别处理
  20. annotation-driven帮助我们完成上述两个实例的注入
  21. -->
  22. <mvc:annotation-driven/>
  23. <!--视图解析器-->
  24. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  25. <property name="prefix" value="/WEB-INF/jsp/"/>
  26. <property name="suffix" value=".jsp"/>
  27. </bean>
  28. </beans>

HelloController

  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("/h1")
  4. public String hello(Model model){
  5. //封装数据
  6. model.addAttribute("msg","HelloSpringMVCAnnotation");
  7. return "hello"; //视图解析器处理
  8. }
  9. }

hello.jsp

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

概念:RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

URL定义

资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。

传统方式操作资源

http://127.0.0.1/item/queryUser.action?id=1查询,GET
http://127.0.0.1/item/saveUser.action 新增,POST
http://127.0.0.1/item/updateUser.action 更新,POST
http://127.0.0.1/item/deleteUser.action?id=1 删除,GET或POST

使用RestFul操作资源:可以通过不同的请求实现不同的效果!

[http://127.0.0.1/item/zr 查询,GET
[http://127.0.0.1/item/ 新增,POST
[http://127.0.0.1/item/ 更新,PUT
[http://127.0.0.1/item/zr 删除,DELETE

学习测试

  1. 新建一个测试类RestFulController,在方法参数前面加@PathVariable注解,让方法参数的值对应绑定到一个URL模板变量上。

    1. @Controller
    2. public class RestFulController {
    3. @RequestMapping("/add/{a}/{b}")
    4. public String test(@PathVariable int a, @PathVariable int b, Model model){
    5. int res = a + b;
    6. model.addAttribute("msg","结果为"+res);
    7. return "test"; //test.jsp
    8. }
    9. }

请求地址相同,得到结果不同的情况

http://localhost:8080/add/3/4

http://localhost:8080/a.jsp

  1. //@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.DELETE)
  2. //@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
  3. @GetMapping("/add/{a}/{b}")
  4. public String test(@PathVariable int a, @PathVariable int b, Model model){
  5. int res = a + b;
  6. model.addAttribute("msg","结果1为"+res);
  7. return "test";
  8. }
  9. @PostMapping("/add/{a}/{b}")
  10. public String test2(@PathVariable int a, @PathVariable int b, Model model){
  11. int res = a + b;
  12. model.addAttribute("msg","结果2为"+res);
  13. return "test";
  14. }

web下a.jsp

  1. <form action="/add/3/4" method="post">
  2. <input type="submit">
  3. </form>

web/WEB-INF/jsp/test.jsp

  1. <body>
  2. ${msg}
  3. </body>

ModelAndView:根据view的名字,和视图解析器跳转到指定的页面。

使用springmvc来实现转发和重定向—–无视图解析器

  1. @Controller
  2. public class ModelTest1 {
  3. @RequestMapping("/m1/t1")
  4. public String test(Model model){
  5. model.addAttribute("msg","ModelTest1");
  6. // return "/WEB-INF/jsp/test.jsp";
  7. //转发
  8. // return "forward:/index.jsp";
  9. //重定向
  10. return "redirect:/index.jsp";
  11. }

使用springmvc来实现转发和重定向—–有视图解析器

  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("/h1")
  4. public String hello(Model model){
  5. //封装数据
  6. model.addAttribute("msg","HelloSpringMVCAnnotation");
  7. return "hello"; //视图解析器处理
  8. }
  9. }

User实体类

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class User {
  5. private int id;
  6. private String name;
  7. private int age;
  8. }

UserController类,使用@RequestParam(“***”)接收参数

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. //localhost:8080/user/t1?name=***
  5. @RequestMapping("/t1")
  6. public String test1(@RequestParam("name") String name, Model model){
  7. //接收前端参数
  8. System.out.println("接收到前端的参数为"+name);
  9. //将结果传递给前端
  10. model.addAttribute("msg",name);
  11. //跳转视图
  12. return "test";
  13. }
  14. /*
  15. 1.接收用户传递的参数,判断参数的名字,假设名字直接在方法上,就可以直接用
  16. 2.假设传递的是一个对象User,匹配User对象的字段名
  17. */
  18. //http://localhost:8080/user/t2?id=1&name=zzzrrr&age=20
  19. //前端接受的是一个对象:id,name,age
  20. @RequestMapping("/t2")
  21. public String test2(User user){
  22. System.out.println(user);
  23. return "test";
  24. }

在开发中,我们会经常遇到乱码问题,在Servlet阶段使用的是编写过滤器过滤。现在SpringMVC也给我们提供了一个过滤器,在xml中配置,然后重启服务器。

web下form.jsp

  1. <body>
  2. <form action="/e/t1" method="post">
  3. <input type="text" name="name">
  4. <input type="submit">
  5. </form>
  6. </body>

EncodingController

  1. @Controller
  2. public class EncodingController {
  3. @PostMapping("/e/t1")
  4. public String test1(String name, Model model){
  5. model.addAttribute("msg",name);
  6. System.out.println(name);
  7. return "test";
  8. }
  9. }

编码过滤器

  1. <!--配置SpringMVC的乱码过滤-->
  2. <filter>
  3. <filter-name>encoding</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>encoding</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>

什么是JSON:

  • JSON(JavaScript Object Notation,js对象标记)是一种轻量级数据交换格式
  • 采用完全独立于编程语言的文本格式来存储和表示数据
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效提升网络传输速率
  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. // 编写一个javascript对象
  8. var user = {
  9. name:"周周",
  10. age:"20",
  11. sex:"南"
  12. };
  13. // 将js对象转化为json对象
  14. var json = JSON.stringify(user);
  15. console.log(json);
  16. // json转化为javascript对象
  17. var js = JSON.parse(json);
  18. console.log(js)
  19. console.log(user);
  20. </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 是最流行的 json 解析器之一 。

Jackson 最常用的 API 就是基于”对象绑定” 的 ObjectMapper。

使用前pom.xml加入依赖

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>xml
  4. <version>2.10.0</version>
  5. </dependency>

web.xml

  1. <!-- 配置DispatcherServlet:这是SpringMVC的核心,请求分发器,前端控制器 -->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 绑定spring的配置文件-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc-servlet.xml</param-value>
  9. </init-param>
  10. <!-- 启动级别-->
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <!--SpringMVC中:
  14. /:匹配所有的请求。不匹配jsp页面
  15. /*:匹配所有的请求。匹配jsp页面
  16. -->
  17. <servlet-mapping>
  18. <servlet-name>springmvc</servlet-name>
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>
  21. <!--配置SpringMVC的乱码过滤-->
  22. <filter>
  23. <filter-name>encoding</filter-name>
  24. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  25. <init-param>
  26. <param-name>encoding</param-name>
  27. <param-value>utf-8</param-value>
  28. </init-param>
  29. </filter>
  30. <filter-mapping>
  31. <filter-name>encoding</filter-name>
  32. <url-pattern>/*</url-pattern>
  33. </filter-mapping>

springmvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!--自动扫描包,让包下的注解生效,由IOC容器统一管理-->
  13. <context:component-scan base-package="com.zr.controller"/>
  14. <!--解决json乱码-->
  15. <mvc:annotation-driven>
  16. <mvc:message-converters register-defaults="true">
  17. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  18. <constructor-arg value="UTF-8"/>
  19. </bean>
  20. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  21. <property name="objectMapper">
  22. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
  23. <property name="failOnEmptyBeans" value="false"/>
  24. </bean>
  25. </property>
  26. </bean>
  27. </mvc:message-converters>
  28. </mvc:annotation-driven>
  29. <!--视图解析器-->
  30. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  31. <property name="prefix" value="/WEB-INF/jsp/"/>
  32. <property name="suffix" value=".jsp"/>
  33. </bean>
  34. </beans>

User类

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class User {
  5. private String name;
  6. private int age;
  7. private String sex;
  8. }

UserController

  1. @RestController //不会走视图解析器,
  2. public class UserController {
  3. //注解解决json乱码 建议在xml中解决乱码
  4. // @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
  5. @RequestMapping("/j1")
  6. //@ResponseBody //不会走视图解析器,会直接返回一个字符串
  7. public String json1() throws JsonProcessingException {
  8. //jackson ObjectMapper
  9. ObjectMapper mapper = new ObjectMapper();
  10. //创建一个对象
  11. User user = new User("周周",20,"南");
  12. String s = mapper.writeValueAsString(user);
  13. return s;
  14. }
  15. }

返回一个json数组,返回格式化时间(方法加在UserController类中)

  1. @RequestMapping("/j2")
  2. public String json2() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. List<User> list = new ArrayList<User>();
  5. User user1 = new User("周周1",20,"南");
  6. User user2 = new User("周周2",20,"南");
  7. User user3 = new User("周周3",20,"南");
  8. User user4 = new User("周周4",20,"南");
  9. list.add(user1);
  10. list.add(user2);
  11. list.add(user3);
  12. list.add(user4);
  13. String s = mapper.writeValueAsString(list);
  14. return s;
  15. }
  16. @RequestMapping("/j3")
  17. public String json3() throws JsonProcessingException {
  18. ObjectMapper mapper = new ObjectMapper();
  19. //自定义日期的格式
  20. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  21. Date date = new Date();
  22. //return mapper.writeValueAsString(date);
  23. return mapper.writeValueAsString(sdf.format(date));
  24. }
  25. @RequestMapping("/j4")
  26. public String json4() throws JsonProcessingException {
  27. ObjectMapper mapper = new ObjectMapper();
  28. //使用ObjectMapper 格式化输出
  29. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
  30. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  31. mapper.setDateFormat(sdf);
  32. Date date = new Date();
  33. return mapper.writeValueAsString(date);
  34. }

封装思想

工具类

  1. public class JsonUtil {
  2. public static String getMapper(Object object,String dateFormat){
  3. ObjectMapper mapper = new ObjectMapper();
  4. //使用ObjectMapper 格式化输出
  5. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
  6. SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
  7. mapper.setDateFormat(sdf);
  8. try {
  9. return mapper.writeValueAsString(object);
  10. } catch (JsonProcessingException e) {
  11. e.printStackTrace();
  12. }
  13. return null;
  14. }
  15. public static String getMapper(Object object){
  16. return getMapper(object,"yyyy-MM-dd HH:mm:ss");
  17. }
  18. }

测试工具类(方法加在UserController类中)

  1. @RequestMapping("/j5")
  2. public String json5() {
  3. Date date = new Date();
  4. return JsonUtil.getMapper(date,"yyyy-MM-dd HH:mm:ss");
  5. }
  6. @RequestMapping("/j6")
  7. public String json6() {
  8. List<User> list = new ArrayList<User>();
  9. User user1 = new User("周周1",20,"南");
  10. User user2 = new User("周周2",20,"南");
  11. User user3 = new User("周周3",20,"南");
  12. User user4 = new User("周周4",20,"南");
  13. list.add(user1);
  14. list.add(user2);
  15. list.add(user3);
  16. list.add(user4);
  17. return JsonUtil.getMapper(list);
  18. }

FastJson是阿里巴巴开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象de转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。

导包

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.74</version>
  5. </dependency>

FastJson三个主要的类

  • JSONObject 代表json对象,JSONObject实现了Map接口
  • JSONArray 代表json数组对象,内部是由list接口中的方法完成操作
  • JSON代表 JSONObject 和 JSONArray的转化
  1. @RequestMapping("/j7")
  2. public String json7() {
  3. List<User> list = new ArrayList<User>();
  4. User user1 = new User("周周1",20,"南");
  5. User user2 = new User("周周2",20,"南");
  6. User user3 = new User("周周3",20,"南");
  7. User user4 = new User("周周4",20,"南");
  8. list.add(user1);
  9. list.add(user2);
  10. list.add(user3);
  11. list.add(user4);
  12. //java对象转json字符串
  13. String s = JSON.toJSONString(list);
  14. System.out.println(s);
  15. String s1 = JSON.toJSONString(user1);
  16. System.out.println("s1: "+s1);
  17. //json字符串转java对象
  18. User s2 = JSON.parseObject(s1,User.class);
  19. System.out.println("s2: "+s2.toString());
  20. //java对象转json对象
  21. JSONObject s3 = (JSONObject) JSON.toJSON(user2);
  22. System.out.println("s3: "+s3.toJSONString());
  23. // json对象转java对象
  24. User s4 = JSON.toJavaObject(s3, User.class);
  25. System.out.println("s4: "+s4);
  26. return "hello";
  27. }
  28. }

新建maven一个项目ssmbuild

环境配置:

pom.xml中导入以下依赖和允许静态资源导出

  1. <!--导入依赖 junit,数据库驱动,连接池,Servlet,jsp,mybatis,mybatis-spring,spring,lembok,spring-jdbc,jstl,standard等-->
  2. <dependencies>
  3. ......
  4. </dependencies>
  5. <!--静态资源导出-->
  6. <build>
  7. <resources>
  8. <resource>
  9. <directory>src/main/resources</directory>
  10. <includes>
  11. <include>**/*.properties</include>
  12. <include>**/*.xml</include>
  13. </includes>
  14. <filtering>false</filtering>
  15. </resource>
  16. <resource>
  17. <directory>src/main/java</directory>
  18. <includes>
  19. <include>**/*.properties</include>
  20. <include>**/*.xml</include>
  21. </includes>
  22. <filtering>false</filtering>
  23. </resource>
  24. </resources>
  25. </build>

database.properties

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. #如果使用的是MySQL 8.0+,增加一个时区的配置
  3. jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=UTF-8
  4. jdbc.username=root
  5. jdbc.password=123456

mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!--核心配置文件-->
  6. <configuration>
  7. <!-- 配置数据源,交给spring去做-->
  8. <typeAliases>
  9. <package name="com.zr.pojo"/>
  10. </typeAliases>
  11. <mappers>
  12. <mapper class="com.zr.dao.BookMapper"/>
  13. </mappers>
  14. </configuration>

spring-dao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. https://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. https://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 关联数据库配置文件-->
  10. <context:property-placeholder location="classpath:database.properties"/>
  11. <!--连接池
  12. dbcp:手动化操作,不能自动连接
  13. c3p0:自动化操作,可以自动化加载配置文件,并且可以自动设置到对象中
  14. durid
  15. hikari
  16. -->
  17. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  18. <property name="driverClass" value="${jdbc.driver}"/>
  19. <property name="jdbcUrl" value="${jdbc.url}"/>
  20. <property name="user" value="${jdbc.username}"/>
  21. <property name="password" value="${jdbc.password}"/>
  22. <!--c3p0私有属性-->
  23. <property name="maxPoolSize" value="30"/>
  24. <property name="minPoolSize" value="10"/>
  25. <!--关闭连接后不自动commit-->
  26. <property name="autoCommitOnClose" value="false"/>
  27. <!--连接超时时间-->
  28. <property name="checkoutTimeout" value="10000"/>
  29. <!--连接失败,自动重连次数-->
  30. <property name="acquireRetryAttempts" value="2"/>
  31. </bean>
  32. <!--sqlSessionFactory-->
  33. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  34. <property name="dataSource" ref="dataSource"/>
  35. <!-- 绑定mybatis配置文件-->
  36. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  37. </bean>
  38. <!--配置dao接口扫描包,动态的实现了dao接口注入到spring容器中-->
  39. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  40. <!--注入sqlSessionFactory-->
  41. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  42. <!--要扫描的dao包-->
  43. <property name="basePackage" value="com.zr.dao"/>
  44. </bean>
  45. </beans>

spring-service.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. https://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. https://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 扫描service下的包-->
  10. <context:component-scan base-package="com.zr.service"/>
  11. <!--将所有的业务类注入到spring,可以通过注解或者配置实现-->
  12. <bean id="BookServiceImpl" class="com.zr.service.BookServiceImpl">
  13. <property name="bookMapper" ref="bookMapper"/>
  14. </bean>
  15. <!--声明式事务配置-->
  16. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  17. <!--注入数据源-->
  18. <property name="dataSource" ref="dataSource"/>
  19. </bean>
  20. </beans>

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <import resource="classpath:spring-dao.xml"/>
  7. <import resource="classpath:spring-service.xml"/>
  8. </beans>

BookMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.zr.dao.BookMapper">
  6. <insert id="addBook" parameterType="Books">
  7. insert into books (bookName,bookCounts,detail)
  8. values (#{bookName},#{bookCounts},#{detail});
  9. </insert>
  10. <delete id="deleteBookById" parameterType="int">
  11. delete from books where bookID=#{id};
  12. </delete>
  13. <update id="updateBook" parameterType="Books">
  14. update books set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
  15. where bookID=#{bookID};
  16. </update>
  17. <select id="selectBookById" resultType="Books">
  18. select * from books where bookID=#{id};
  19. </select>
  20. <select id="selectAllBook" resultType="Books">
  21. select * from books;
  22. </select>
  23. </mapper>

web.xml 【classpath:applicationContext.xml】bean的创建交给了applicationContext.xml

  1. <!--DispatcherServlet-->
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <init-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:applicationContext.xml</param-value>
  8. </init-param>
  9. <load-on-startup>1</load-on-startup>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>springmvc</servlet-name>
  13. <url-pattern>/</url-pattern>
  14. </servlet-mapping>
  15. <!--乱码过滤-->
  16. <filter>
  17. <filter-name>encoding</filter-name>
  18. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  19. <init-param>
  20. <param-name>encoding</param-name>
  21. <param-value>utf-8</param-value>
  22. </init-param>
  23. </filter>
  24. <filter-mapping>
  25. <filter-name>encoding</filter-name>
  26. <url-pattern>/*</url-pattern>
  27. </filter-mapping>
  28. <!--session-->
  29. <session-config>
  30. <session-timeout>15</session-timeout>
  31. </session-config>

实体类

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Books {
  5. private int bookID;
  6. private String bookName;
  7. private int bookCounts;
  8. private String detail;
  9. }

BookMapper

  1. public interface BookMapper {
  2. //增加一本书
  3. int addBook(Books books);
  4. //删除一本书
  5. int deleteBookById(@Param("id") int id);
  6. //修改一本书
  7. int updateBook(Books books);
  8. //查询一本书
  9. Books selectBookById(@Param("id") int id);
  10. //查询全部
  11. List<Books> selectAllBook();
  12. }

BookService

  1. public interface BookService {
  2. //增加一本书
  3. int addBook(Books books);
  4. //删除一本书
  5. int deleteBookById(@Param("id") int id);
  6. //修改一本书
  7. int updateBook(Books books);
  8. //查询一本书
  9. Books selectBookById(@Param("id") int id);
  10. //查询全部
  11. List<Books> selectAllBook();
  12. }

BookServiceImpl

  1. public class BookServiceImpl implements BookService{
  2. //service调用dao层:组合dao层
  3. private BookMapper bookMapper;
  4. public void setBookMapper(BookMapper bookMapper) {
  5. this.bookMapper = bookMapper;
  6. }
  7. public int addBook(Books books) {
  8. return bookMapper.addBook(books);
  9. }
  10. public int deleteBookById(int id) {
  11. return bookMapper.deleteBookById(id);
  12. }
  13. public int updateBook(Books books) {
  14. return bookMapper.updateBook(books);
  15. }
  16. public Books selectBookById(int id) {
  17. return bookMapper.selectBookById(id);
  18. }
  19. public List<Books> selectAllBook() {
  20. return bookMapper.selectAllBook();
  21. }
  22. }

Ajax:异步,能在无需加载整个页面的情况下,更新部分网页的技术。

Ajax不是一种编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。

web.xml配置DispatcherServlet和encoding,spring-mvc.xml配置视图解析器,扫描包,支持注解驱动,静态资源支持

test.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>iframe测试体验页面无刷新</title>
  6. <script>
  7. function go() {
  8. var url = document.getElementById("url").value;
  9. document.getElementById("iframe1").src=url;
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <div>
  15. <p>请输入地址:</p>
  16. <p>
  17. <input type="text" id="url" value="https://www.cnblogs.com/zhou-zr/">
  18. <input type="button" value="提交" onclick="go()">
  19. </p>
  20. </div>
  21. <div>
  22. <iframe id="iframe1" style="width: 100%;height: 500px">
  23. </iframe>
  24. </div>
  25. </body>
  26. </html>

Ajax的核心就是XMLHttpRequest。

  1. package com.zr.pojo;
  2. @Data
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. public class User {
  6. private int id;java
  7. private String name;
  8. private String sex;
  9. }

AjaxController

  1. package com.zr.controller;
  2. @RestController
  3. public class AjaxController {
  4. @RequestMapping("/t1")
  5. public String test(){
  6. return "hello";
  7. }
  8. @RequestMapping("/a")
  9. public void a1(String name, HttpServletResponse response) throws IOException {
  10. System.err.println("name--->>"+name);
  11. if ("zr".equals(name)){
  12. response.getWriter().println("true");
  13. }else {
  14. response.getWriter().println("false");
  15. }
  16. }
  17. }

index.jsp

  1. <head>
  2. <title>$Title$</title>
  3. <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  4. <%-- <script src="${pageContext.request.contextPath}/static/js/jquery-3.5.1.js"></script>--%>
  5. <script>
  6. function a(){
  7. $.ajax({
  8. url:"${pageContext.request.contextPath}/a",
  9. data:{"name":$("#username").val()},
  10. success:function (data) {
  11. alert(data);
  12. }
  13. })
  14. }
  15. </script>
  16. </head>
  17. <body>
  18. <%-- 失去焦点的时候,发送一个请求到后台--%>
  19. 用户名:<input type="text" id="username" onblur="a()">
  20. </body>

test2.jsp

  1. <html>
  2. <head>
  3. <title>Title</title>
  4. <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  5. <script>
  6. $(function () {
  7. $("#btn").click(function () {
  8. console.log("111");
  9. $.post("${pageContext.request.contextPath}/a2",function (data) {
  10. // console.log(data);
  11. var html="";
  12. for (let i = 0; i < data.length; i++) {
  13. html += "<tr>"+
  14. "<td>"+ data[i].id+"</td>"+
  15. "<td>"+ data[i].name+"</td>"+
  16. "<td>"+ data[i].sex+"</td>"+
  17. "</tr>"
  18. }
  19. $("#context").html(html)
  20. });
  21. })
  22. });
  23. </script>
  24. </head>
  25. <body>
  26. <input type="button" value="加载数据" id="btn">
  27. <table>
  28. <tr>
  29. <td>编号</td>
  30. <td>姓名</td>
  31. <td>性别</td>
  32. </tr>
  33. <tbody id="context">
  34. <%-- 数据--%>
  35. </tbody>
  36. </table>
  37. </body>
  38. </html>

AjaxController

  1. @RequestMapping("/a2")
  2. public List<User> a2(){
  3. List<User> userList = new ArrayList<User>();
  4. //添加数据
  5. userList.add(new User(1,"周zrr","南"));
  6. userList.add(new User(2,"周","南"));
  7. userList.add(new User(3,"周周周","南"));
  8. return userList;
  9. }

login.jsp

  1. <html>
  2. <head>
  3. <title>Title</title>
  4. <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  5. <%-- <script src="${pageContext.request.contextPath}/static/js/jquery-3.5.1.js"></script>--%>
  6. <script>
  7. function a1() {
  8. $.ajax({
  9. url:"${pageContext.request.contextPath}/a3",
  10. data: {"name":$("#name").val()},
  11. success:function (data) {
  12. // alert(data);
  13. // console.log(data);
  14. if (data.toString()==='ok'){
  15. $("#userinfo").css("color","green");
  16. }else {
  17. $("#userinfo").css("color","red");
  18. }
  19. $("#userinfo").html(data);
  20. }
  21. })
  22. }
  23. function a2() {
  24. $.ajax({
  25. url:"${pageContext.request.contextPath}/a3",
  26. data:{"pwd":$("#pwd").val()},
  27. success:function (data) {
  28. //alert(data);
  29. // console.log(data);
  30. if (data.toString()==='ok'){
  31. $("#pwdinfo").css("color","green");
  32. }else {
  33. $("#pwdinfo").css("color","red");
  34. }
  35. $("#pwdinfo").html(data);
  36. }
  37. })
  38. }
  39. </script>
  40. </head>
  41. <body>
  42. <p>
  43. 用户名:<input type="text" id="name" onblur="a1()">
  44. <span id="userinfo"></span>
  45. </p>
  46. <p>
  47. 密码:<input type="password" id="pwd" onblur="a2()">
  48. <span id="pwdinfo"></span>
  49. </p>
  50. </body>
  51. </html>

AjaxController

  1. @RequestMapping("/a3")
  2. public String a3(String name,String pwd){
  3. String msg="";
  4. if (name!=null){
  5. //这些数据应该从数据库中查
  6. if ("admin".equals(name)){
  7. msg = "ok";
  8. }else {
  9. msg = "用户名输入错误";
  10. }
  11. }
  12. if (pwd!=null){
  13. if ("123456".equals(pwd)){
  14. msg = "ok";
  15. }else {
  16. msg = "密码有误";
  17. }
  18. }
  19. return msg;
  20. }

SpringMVC中的拦截器类似于Servlet中的过滤器filter,用于对处理器进行预处理和后处理,开发者可以定义拦截器来实现特定的功能。

过滤器和拦截器的区别:拦截器是Aop思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置/*后,可以对所有要请求的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了该框架才可以使用
  • 拦截器只会拦截访问控制器的方法,访问静态资源不会拦截

搭建环境测试

application.xml

  1. <!--自动扫描包,让包下的注解生效,由IOC容器统一管理-->
  2. <context:component-scan base-package="com.zr.controller"/>
  3. <mvc:default-servlet-handler/>
  4. <mvc:annotation-driven/>
  5. <!--视图解析器-->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  7. <property name="prefix" value="/WEB-INF/jsp/"/>
  8. <property name="suffix" value=".jsp"/>
  9. </bean>

web.xml

  1. <servlet>
  2. <servlet-name>springmvc</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:applicationContext.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springmvc</servlet-name>
  12. <url-pattern>/</url-pattern>
  13. </servlet-mapping>
  14. <filter>
  15. <filter-name>encoding</filter-name>
  16. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  17. <init-param>
  18. <param-name>encoding</param-name>
  19. <param-value>utf-8</param-value>
  20. </init-param>
  21. </filter>
  22. <filter-mapping>
  23. <filter-name>encoding</filter-name>
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>

web下index.jsp

  1. <body>
  2. <h1>
  3. <a href="${pageContext.request.contextPath}/user/gologin">登录界面</a></h1>
  4. <h1> <a href="${pageContext.request.contextPath}/user/main">首页</a></h1>
  5. </body>

WEB-INF/jsp/login.jsp

  1. <body>
  2. <form action="${pageContext.request.contextPath}/user/login" method="post">
  3. 用户名:<input type="text" name="username">
  4. 密码:<input type="password" name="password">
  5. <input type="submit" value="提交">
  6. </form>
  7. </body>

WEB-INF/jsp/main.jsp

  1. <body>
  2. <%--在WEB_INF下的所有界面,只能通过servletcontroller访问--%>
  3. <h1>首页</h1>
  4. ${username}
  5. ${pageContext.request.getSession("userinfo").getValue(username)}
  6. <p>
  7. <a href="${pageContext.request.contextPath}/user/goOut">注销</a>
  8. </p>
  9. </body>

LoginController

  1. package com.zr.controller;
  2. @Controller
  3. @RequestMapping("/user")
  4. public class LoginController {
  5. @RequestMapping("/main")
  6. public String main(){
  7. return "main";
  8. }
  9. @RequestMapping("/gologin")
  10. public String login(){
  11. return "login";
  12. }
  13. @RequestMapping("/login")
  14. public String login(String username, String password, HttpSession session, Model model){
  15. //把用户的信息存在Session中
  16. session.setAttribute("userInfo",username);
  17. model.addAttribute("username",username);
  18. System.out.println(model.getAttribute("username"));
  19. return "main";
  20. }
  21. @RequestMapping("/goOut")
  22. public String goOut(HttpSession session){
  23. //把用户的信息删除
  24. session.removeAttribute("userinfo");
  25. return "main";
  26. }
  27. }

配置拦截器LoginIntercepter

  1. public class LoginIntercepter implements HandlerInterceptor {
  2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  3. System.out.println("登录拦截器==========");
  4. HttpSession session = request.getSession();
  5. //放行的判断
  6. //登录页面要放行 包含login 即gologin和login
  7. if (request.getRequestURI().contains("login")){
  8. return true;
  9. }
  10. if (session.getAttribute("userinfo")!=null){
  11. return true;
  12. }
  13. //判断什么情况下没有登录
  14. System.out.println("返回登录页==========");
  15. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
  16. return false;
  17. }
  18. }

配置到application.xml中

  1. <!--拦截器配置-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--包括这个请求下的所有请求-->
  5. <mvc:mapping path="/user/**"/>
  6. <bean class="com.zr.config.LoginIntercepter"/>
  7. </mvc:interceptor>
  8. </mvc:interceptors>

SpringMVC中配置CommonsMultipartResolver。

前端表单method设置为post,并将enctype设置为multipart/form-data。

对表单中enctype属性的详细说明:

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的value属性值,采用这种编码方式的表单会将表单域中的值处理成URL编码方式。
  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的的内容也封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转化为 “+” 号外,其它字母都不做编码处理,这种方式适用直接通过表单发送文件。

在以上项目的pom文件中新增commons-fileupload,commons-io。

index.jsp

  1. <body>
  2. <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
  3. <input type="file" name="file">
  4. <input type="submit" value="upload">
  5. </form>
  6. </body>

application.xml中增加文件上传配置

  1. <!--文件上传配置-->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!--请求的编码格式,必须和jsp的pageEncoding的属性一致,以便正确读取表单内容,默认ISO-8859-1-->
  4. <property name="defaultEncoding" value="utf-8"/>
  5. <!--上传文件大小限制,单位是字节,10485760=10M-->
  6. <property name="maxUploadSize" value="10485760"/>
  7. <property name="maxInMemorySize" value="40960"/>
  8. </bean>

controller

  1. package com.zr.controller;
  2. @RestController
  3. public class FileController {
  4. //@RequestParam("file"),将name=file属性的文件封装成CommonsMultipartResolver对象
  5. //批量上传CommonsMultipartFile
  6. @RequestMapping("/upload")
  7. public String Fileupload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
  8. //获取文件名
  9. String uploadFileName = file.getOriginalFilename();
  10. //如果文件名为空,直接回到首页
  11. if ("".equals(uploadFileName)){
  12. return "redirect:/index.jsp";
  13. }
  14. System.out.println("上传的文件名为:"+uploadFileName);
  15. //上传路径保存设置
  16. String path = request.getSession().getServletContext().getRealPath("/upload");
  17. //如果路径不存在,创建一个
  18. File realPath = new File(path);
  19. if (!realPath.exists()){
  20. realPath.mkdir();
  21. }
  22. System.out.println("上传文件保存地址为:"+realPath);
  23. InputStream is = file.getInputStream();
  24. OutputStream os = new FileOutputStream(new File(realPath,uploadFileName));
  25. //读取写出
  26. int len=0;
  27. byte[] buffer = new byte[1024];
  28. while ((len=is.read(buffer))!=-1){
  29. os.write(buffer,0,len);
  30. os.flush();
  31. }
  32. os.close();
  33. is.close();
  34. return "redirect:/index.jsp";
  35. }
  36. }

上传方式二

  1. @RequestMapping("/upload2")
  2. public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
  3. //上传路径设置
  4. String path = request.getSession().getServletContext().getRealPath("/upload");
  5. File realPath = new File(path);
  6. if (!realPath.exists()){
  7. realPath.mkdir();
  8. }
  9. //上传文件地址
  10. System.out.println("上传文件保存地址为:"+realPath);
  11. //通过 的方法直接写文件(注意)
  12. file.transferTo(new File(realPath+"/"+file.getOriginalFilename()));
  13. return "redirect:/index.jsp";
  14. }

下载文件

  1. @RequestMapping("/downLoad")
  2. public String downLoad(HttpServletResponse response,HttpServletRequest request) throws IOException {
  3. //要下载的图片地址
  4. String path = request.getSession().getServletContext().getRealPath("/upload");
  5. String fileName = "1.jpg";
  6. //设置respons响应头
  7. response.reset();//设置在页面不缓存,清空buffer
  8. response.setCharacterEncoding("utf-8");//字符编码
  9. response.setContentType("multipart/form-data");//二进制创数数据
  10. //设置响应头
  11. response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
  12. File file = new File(path, fileName);
  13. InputStream in = new FileInputStream(file);
  14. ServletOutputStream out = response.getOutputStream();
  15. //
  16. int len = 0;
  17. byte[] buffer = new byte[1024];
  18. while ((len = in.read(buffer)) != -1) {
  19. out.write(buffer, 0, len);
  20. out.flush();
  21. }
  22. out.close();
  23. in.close();
  24. return null;
  25. }

版权声明:本文为zhou-zr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhou-zr/p/14590292.html