SpringMVC学习笔记02

1.数据处理及跳转

1.1 结果跳转方式

ModelAndView

设置ModelAndView对象,根据view的名称,和视图解析器跳到指定的页面

页面:{视图解析器前缀}+viewName+{视图解析器后缀}

  1. <!-- 视图解析器 -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  3. id="internalResourceViewResolver">
  4. <!-- 前缀 -->
  5. <property name="prefix" value="/WEB-INF/jsp/" />
  6. <!-- 后缀 -->
  7. <property name="suffix" value=".jsp" />
  8. </bean>

对应的Controller类

  1. public class ControllerTest1 implements Controller {
  2. public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  3. //返回一个模型视图对象
  4. ModelAndView mv=new ModelAndView();
  5. mv.addObject("msg","TestController1");
  6. mv.setViewName("hello");
  7. return mv;
  8. }
  9. }

ServletAPI

通过设置ServletAPI,不需要视图解析器

  1. 通过HttpServletResponse进行输出
  2. 通过HttpServletResponse实现重定向
  3. 通过HttpServletResponse实现转发
  1. @Controller
  2. public class ControllerTest5 {
  3. @RequestMapping("/result/t1")
  4. public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
  5. rsp.getWriter().println("Hello,Spring By Servlet API");
  6. }
  7. @RequestMapping("/result/t2")
  8. public void test2(HttpServletRequest req,HttpServletResponse rsp) throws IOException {
  9. rsp.sendRedirect("index.jsp");
  10. }
  11. @RequestMapping("result/t3")
  12. public void test3(HttpServletRequest req,HttpServletResponse rsp) throws ServletException, IOException {
  13. //转发
  14. req.setAttribute("msg","/result/t3");
  15. req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,rsp);
  16. }
  17. }

SpringMVC

通过SpringMVC来实现转发和重定向,无需视图解析器

测试前,需要将视图解析器注释掉

  1. @Controller
  2. public class ControllerTest6 {
  3. @RequestMapping("/rsm/t1")
  4. public String test1(){
  5. //转发
  6. return "/index.jsp";
  7. }
  8. @RequestMapping("/rsm/t2")
  9. public String test2(){
  10. //转发2
  11. return "forward:/index.jsp";
  12. }
  13. @RequestMapping("/rsm/t3")
  14. public String test3(){
  15. //重定向
  16. return "redirect:/index.jsp";
  17. }
  18. }

测试结果:

test1

SpringMVC学习笔记02 - 图1

test2

SpringMVC学习笔记02 - 图2

test3

SpringMVC学习笔记02 - 图3

通过SpringMVC来实现转发和重定向-有视图解析器

重定向,不需要视图解析器,本质就是重新请求到一个新地方,所以注意路径问题,可以重定向到另外一个请求实现

  1. @RequestMapping("/rsm2/t1")
  2. public String test4(){
  3. //转发
  4. return "hello";
  5. }
  6. @RequestMapping("/rsm2/t2")
  7. public String test5(){
  8. //重定向
  9. return "redirect:/index.jsp";
  10. //return "redirect:hello.do"; //hello.do为另一个请求/
  11. }

1.2 数据处理

处理提交数据

1.提交的域名城和处理方法的参数名一致

提交数据:http://localhost:8080/user/t1?name=jcsune

处理方法:

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. //Localhost:8080/user/t1 ?name=xxx
  5. @GetMapping("/t1")
  6. public String test1(String name, Model model){
  7. //1.接收前端参数
  8. System.out.println("接收到的前端参数为 :"+name);
  9. //2.将返回的结果传递给前端
  10. model.addAttribute("msg",name);
  11. //3.视图跳转
  12. return "hello";
  13. }
  14. }

后台输出:

SpringMVC学习笔记02 - 图4

2.提交的域名城和处理方法的参数名不一致

提交数据:http://localhost:8080/user/t2?username=jcsune

处理方法:

  1. //@RequestParam("username") :username提交的域的名称
  2. @GetMapping("/t2")
  3. public String test2(@RequestParam("username") String name, Model model){
  4. //1.接收前端参数
  5. System.out.println("接收到的前端参数为 :"+name);
  6. //2.将返回的结果传递给前端
  7. model.addAttribute("msg",name);
  8. //3.视图跳转
  9. return "hello";
  10. }

后台输出:

SpringMVC学习笔记02 - 图5

3.提交的是一个对象

要求提交的表单域和对象的属性名一致,参数使用对象即可

  1. 实体类
  1. package com.jcsune.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9. private int id;
  10. private String name;
  11. private int age;
  12. }
  1. 提交数据 http://localhost:8080/user/t3?id=1&name=jcsune&age=18
  2. 处理方法
  1. @GetMapping("/t3")
  2. public String test3(User user){
  3. System.out.println(user);
  4. return "hello";
  5. }
  1. 后台输出

SpringMVC学习笔记02 - 图6

说明:如果使用的是对象的话,前端传递的参数名和对象名必须一致,否则就是null

数据显示到前端

第一种:通过ModelAndView

  1. public class ControllerTest1 implements Controller {
  2. public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  3. //返回一个模型视图对象
  4. ModelAndView mv=new ModelAndView();
  5. mv.addObject("msg","TestController1");
  6. mv.setViewName("hello");
  7. return mv;
  8. }
  9. }

第二种:通过ModelMap

  1. @RequestMapping("/hello")
  2. public String hello(@RequestParam("username") String name, ModelMap model){
  3. //封装要显示到视图中的数据
  4. //相当于req.setAttribute("name",name);
  5. model.addAttribute("name",name);
  6. System.out.println(name);
  7. return "hello";
  8. }

第三种:通过Model

  1. @RequestMapping("/ct2/hello")
  2. public String hello(@RequestParam("username") String name, Model model){
  3. //封装要显示到视图中的数据
  4. //相当于req.setAttribute("name",name);
  5. model.addAttribute("msg",name);
  6. System.out.println(name);
  7. return "test";
  8. }

对于新手而言使用区别:

  • Model只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解
  • ModelMap继承了LinkedMap,除了实现自身的一些方法,同样的继承LinkedMap的方法和特性
  • ModelAndView可以在储存数据的同时,进行设置返回得出逻辑视图,进行控制展示层的跳转

以后开发考虑更多的是性能和优化,就不能单单仅限于此的了解

1.3 乱码问题

测试步骤

  1. 在首页编写一个提交的表单
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>jcsune</title>
  5. </head>
  6. <body>
  7. <form action="/e/t1" method="post">
  8. <input type="text" name="name">
  9. <input type="submit">
  10. </form>
  11. </body>
  12. </html>
  1. 后台编写对应的处理类
  1. @Controller
  2. public class EncodingController {
  3. @PostMapping("/e/t1")
  4. public String test1(String name, Model model){
  5. model.addAttribute("msg",name);//获取表单提交的值
  6. return "hello";//跳转到 hello页面显示输入的值
  7. }
  8. }
  1. 输入中文测试,发现乱码

SpringMVC学习笔记02 - 图7

乱码问题在开发中是十分常见的问题,以前乱码问题可以通过,而springmvc给我们提供了一个过滤器,可以在web.xml中配置

注意:修改xml文件需要重启服务器

  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>encoding</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

再次测试:

SpringMVC学习笔记02 - 图8

但在一些极端情况下,这个过滤器对get的支持不好

处理方法:

  1. 修改Tomcat配置文件:设置编码:
  1. <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443" />
  1. 自定义过滤器:网上的一些大神写的
  1. package com.jcsune.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.UnsupportedEncodingException;
  8. import java.util.Map;
  9. /**
  10. * 解决get和post请求 全部乱码的过滤器
  11. */
  12. public class EncodingFilter implements Filter {
  13. @Override
  14. public void destroy() {
  15. }
  16. @Override
  17. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  18. //处理response的字符编码
  19. HttpServletResponse myResponse=(HttpServletResponse) response;
  20. myResponse.setContentType("text/html;charset=UTF-8");
  21. // 转型为与协议相关对象
  22. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  23. // 对request包装增强
  24. HttpServletRequest myrequest = new MyRequest(httpServletRequest);
  25. chain.doFilter(myrequest, response);
  26. }
  27. @Override
  28. public void init(FilterConfig filterConfig) throws ServletException {
  29. }
  30. }
  31. //自定义request对象,HttpServletRequest的包装类
  32. class MyRequest extends HttpServletRequestWrapper {
  33. private HttpServletRequest request;
  34. //是否编码的标记
  35. private boolean hasEncode;
  36. //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
  37. public MyRequest(HttpServletRequest request) {
  38. super(request);// super必须写
  39. this.request = request;
  40. }
  41. // 对需要增强方法 进行覆盖
  42. @Override
  43. public Map getParameterMap() {
  44. // 先获得请求方式
  45. String method = request.getMethod();
  46. if (method.equalsIgnoreCase("post")) {
  47. // post请求
  48. try {
  49. // 处理post乱码
  50. request.setCharacterEncoding("utf-8");
  51. return request.getParameterMap();
  52. } catch (UnsupportedEncodingException e) {
  53. e.printStackTrace();
  54. }
  55. } else if (method.equalsIgnoreCase("get")) {
  56. // get请求
  57. Map<String, String[]> parameterMap = request.getParameterMap();
  58. if (!hasEncode) { // 确保get手动编码逻辑只运行一次
  59. for (String parameterName : parameterMap.keySet()) {
  60. String[] values = parameterMap.get(parameterName);
  61. if (values != null) {
  62. for (int i = 0; i < values.length; i++) {
  63. try {
  64. // 处理get乱码
  65. values[i] = new String(values[i]
  66. .getBytes("ISO-8859-1"), "utf-8");
  67. } catch (UnsupportedEncodingException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72. }
  73. hasEncode = true;
  74. }
  75. return parameterMap;
  76. }
  77. return super.getParameterMap();
  78. }
  79. //取一个值
  80. @Override
  81. public String getParameter(String name) {
  82. Map<String, String[]> parameterMap = getParameterMap();
  83. String[] values = parameterMap.get(name);
  84. if (values == null) {
  85. return null;
  86. }
  87. return values[0]; // 取回参数的第一个值
  88. }
  89. //取所有值
  90. @Override
  91. public String[] getParameterValues(String name) {
  92. Map<String, String[]> parameterMap = getParameterMap();
  93. String[] values = parameterMap.get(name);
  94. return values;
  95. }
  96. }

一般情况下,springmvc默认的乱码处理就已经能够很好的解决了

  1. 在web.xml中配置这个过滤器即可
  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>com.jcsune.filter.EncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>encoding</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码UTF-8

2.JSON交互处理

2.1 什么是JSON

  • JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛
  • 采用完全独立于编程语言的文本格式来存储和表示数据
  • 简介和清晰的层次结构使得JSON成为理想的数据交换语言
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率

在JavaScript语言中,一切都是对象,因此任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等,它的语法格式和要求为:

  • 对象表示为键值对,数据由逗号分割
  • 花括号保存对象
  • 方括号保存数组

JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异键值对组合中的键名写在前面并用双引号””包裹,使用冒号:分割,然后紧接着值:

  1. {"name":"刘也"}
  2. {"age":"23"}
  3. {"sex":"男"}

JSON是javas对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串

  1. var obj={a:'hello',b:'world'};//这是一个对象
  2. var json={"a":"helo","b":"world"};//这是一个JSON字符串,本质是一个字符串

JSON和JavaScript对象互转

要实现从JSON字符串转换为JavaScript对象,使用JSON.parse()方法;

  1. var obj=JSON.parse('{"a":"helo","b":"world"}');
  2. //结果是{a:'hello',b:'world'}

要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify()方法;

  1. var json=JSON.stringify({a:'hello',b:'world'});
  2. //结果是'{"a":"helo","b":"world"}'

代码测试

  1. 新建一个module,springmvc-05,添加web的支持
  2. 在web目录下新建一个json-1.html,编写测试内容
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //编写一个js的对象
  8. var user ={
  9. name:"刘也",
  10. age:23,
  11. sex:"男"
  12. };
  13. //将js对象转换成json字符串
  14. var str=JSON.stringify(user);
  15. console.log(str);
  16. //将json字符串转换成js对象
  17. var user2=JSON.parse(str);
  18. console.log(user2.age,user2.name,user2.sex);
  19. </script>
  20. </head>
  21. <body>
  22. </body>
  23. </html>
  1. 在idea中用浏览器打开,查看控制台输出

SpringMVC学习笔记02 - 图9

2.2 Jackson的使用

Jackson应该是目前比较好的json解析工具了

当然工具不止这一个,比如还有阿里巴巴的fastjson等等

Controller返回json数据

  1. 我们这里使用的是Jackson,使用它需要导入它的jar包
  1. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  2. <dependency>
  3. <groupId>com.fasterxml.jackson.core</groupId>
  4. <artifactId>jackson-databind</artifactId>
  5. <version>2.11.2</version>
  6. </dependency>
  1. 配置SpringMVC需要的配置

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!--1.注册servlet-->
  7. <servlet>
  8. <servlet-name>SpringMVC</servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10. <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:springmvc-servlet.xml</param-value>
  14. </init-param>
  15. <!-- 启动顺序,数字越小,启动越早 -->
  16. <load-on-startup>1</load-on-startup>
  17. </servlet>
  18. <!--所有请求都会被springmvc拦截 -->
  19. <servlet-mapping>
  20. <servlet-name>SpringMVC</servlet-name>
  21. <url-pattern>/</url-pattern>
  22. </servlet-mapping>
  23. <filter>
  24. <filter-name>encoding</filter-name>
  25. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  26. <init-param>
  27. <param-name>encoding</param-name>
  28. <param-value>utf-8</param-value>
  29. </init-param>
  30. </filter>
  31. <filter-mapping>
  32. <filter-name>encoding</filter-name>
  33. <url-pattern>/</url-pattern>
  34. </filter-mapping>
  35. </web-app>

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. http://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.jcsune.controller"/>
  14. <!-- 视图解析器 -->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  16. id="internalResourceViewResolver">
  17. <!-- 前缀 -->
  18. <property name="prefix" value="/WEB-INF/jsp/" />
  19. <!-- 后缀 -->
  20. <property name="suffix" value=".jsp" />
  21. </bean>
  22. </beans>
  1. 随便编写一个User的实体类,然后去编写我们的测试Controller
  1. package com.jcsune.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. //需要导入lombok
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class User {
  10. private String name;
  11. private int age;
  12. private String sex;
  13. }a

这里我们需要两个新东西,一个是@ResponseBody,一个是ObjectMapper对象,我们看下具体的用法

编写一个Controller

  1. @Controller
  2. public class UserController {
  3. @RequestMapping("/json1")
  4. @ResponseBody
  5. public String json1() throws JsonProcessingException {
  6. //创建一个Jackson的对象映射器,用来解析数据
  7. ObjectMapper mapper = new ObjectMapper();
  8. //创建一个对象
  9. User user=new User("刘也",23,"男");
  10. //将我们的对象解析成为json格式
  11. String str=mapper.writeValueAsString(user);
  12. //由于@ResponseBody注解,这里会将str转换json格式返回;十分方便
  13. return str;
  14. }
  15. }
  1. 配置Tomcat,启动测试一下

http://localhost:8080/json1

SpringMVC学习笔记02 - 图10

发现出现了乱码问题,我们需要设置一下它的编码格式为utf-8,以及它返回的类型

通过@RequestMapping的produces属性来实现,修改下代码

  1. //produces:指定响应体返回类型和编码
  2. @RequestMapping(value="/json1",produces = "application/json;charset=utf-8")

再次测试,发现乱码问题解决

SpringMVC学习笔记02 - 图11

乱码统一解决

上一种方法比较麻烦,如果项目中有许多请求,则每一个都要添加,可以通过spring配置统一指定,这样就不用每次去处理了

我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置

  1. <mvc:annotation-driven>
  2. <mvc:message-converters register-defaults="true">
  3. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  4. <constructor-arg value="UTF-8"/>
  5. </bean>
  6. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  7. <property name="objectMapper">
  8. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
  9. <property name="failOnEmptyBeans" value="false"/>
  10. </bean>
  11. </property>
  12. </bean>
  13. </mvc:message-converters>
  14. </mvc:annotation-driven>

返回JSON字符串统一解决

在类上直接使用@RestController,这样子里面所有的方法都只会返回json字符串了,不用在每一个都添加@ResponseBody!我们在前后端分离开发中,一般都使用@RestController,十分便捷

  1. //@Controller
  2. @RestController
  3. public class UserController {
  4. //produces:指定响应体返回类型和编码
  5. //@RequestMapping(value="/json1",produces = "application/json;charset=utf-8")
  6. @RequestMapping("/json1")
  7. //@ResponseBody
  8. public String json1() throws JsonProcessingException {
  9. //创建一个Jackson的对象映射器,用来解析数据
  10. ObjectMapper mapper = new ObjectMapper();
  11. //创建一个对象
  12. User user=new User("刘也",23,"男");
  13. //将我们的对象解析成为json格式
  14. String str=mapper.writeValueAsString(user);
  15. //由于@ResponseBody注解,这里会将str转换json格式返回;十分方便
  16. return str;
  17. }
  18. }

启动Tomcat测试,结果都正常输出

SpringMVC学习笔记02 - 图12

测试集合输出

增加一个新的方法

  1. @RequestMapping("/json2")
  2. public String json2() throws JsonProcessingException {
  3. //创建一个Jackson的对象映射器,用来解析数据
  4. ObjectMapper mapper = new ObjectMapper();
  5. //创建一个对象
  6. User user1=new User("刘也1号",23,"男");
  7. User user2=new User("刘也2号",23,"男");
  8. User user3=new User("刘也3号",23,"男");
  9. User user4=new User("刘也4号",23,"男");
  10. List<User> list=new ArrayList<User>();
  11. list.add(user1);
  12. list.add(user2);
  13. list.add(user3);
  14. list.add(user4);
  15. //将我们的对象解析成json格式
  16. String str=mapper.writeValueAsString(list);
  17. return str;
  18. }

运行结果:

SpringMVC学习笔记02 - 图13

输出时间对象

增加一个新的方法

  1. @RequestMapping("/json3")
  2. public String json3() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. //创建一个时间对象,java.util.Date
  5. Date date=new Date();
  6. //将我们的对象解析成json格式
  7. String str=mapper.writeValueAsString(date);
  8. return str;
  9. }

运行结果:

SpringMVC学习笔记02 - 图14

  • 默认日期格式会变成一个数字,是1970年1月1日到当前日期的毫秒数!
  • Jackson默认是会把时间转成timestamps形式

解决方案:取消timestamps形式,自定义时间格式

  1. @RequestMapping("/json4")
  2. public String json4() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. //不使用时间戳的方式
  5. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
  6. //自定义日期格式对象
  7. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  8. //指定日期格式
  9. mapper.setDateFormat(sdf);
  10. Date date=new Date();
  11. String str=mapper.writeValueAsString(date);
  12. return str;
  13. }

运行结果:成功输出了时间

SpringMVC学习笔记02 - 图15

抽取为工具类

如果要经常使用的话,这样是比较麻烦的,我们可以将这些代码封装到一个工具类中

  1. package com.jcsune.utils;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.databind.SerializationFeature;
  5. import java.text.SimpleDateFormat;
  6. public class JsonUtils {
  7. public static String getJson(Object object) {
  8. return getJson(object,"yyyy-MM-dd HH:mm:ss");
  9. }
  10. public static String getJson(Object object,String dateFormat) {
  11. ObjectMapper mapper = new ObjectMapper();
  12. //不使用时间差的方式
  13. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  14. //自定义日期格式对象
  15. SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
  16. //指定日期格式
  17. mapper.setDateFormat(sdf);
  18. try {
  19. return mapper.writeValueAsString(object);
  20. } catch (JsonProcessingException e) {
  21. e.printStackTrace();
  22. }
  23. return null;
  24. }
  25. }

我们使用工具类,代码就更加简洁了

  1. @RequestMapping("/json5")
  2. public String json5(){
  3. Date date=new Date();
  4. String json= JsonUtils.getJson(date);
  5. return json;
  6. }

测试结果:

SpringMVC学习笔记02 - 图16

2.3 FastJson

fastjson.jar是阿里开发的一款专门用于java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换,实现json的转换方法很多,最后的实现结果都是一样的

fastjson的pom依赖

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

fastjson三个主要的类

JSONObject 代表json对象

  • JSONObject实现了Map接口,猜想JSONObject底层操作是由Map实现的
  • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取”键:值”对的个数和判断是否为空,其本质是通过实现Map接口并调用接口中的办法完成的

JSONArray 代表json对象数组

  • 内部是有List接口中的方法来完成操作的

JSON代表JSONObject和JSONArray的转化

  • JSON类源码分析和使用
  • 仔细观察这些方法,主要是实现json对象,json对象数组,Javabean对象,json字符串之间的相互转化

代码测试:新建一个FastJsonDemo类

  1. public class FastJsonDemo {
  2. public static void main(String[] args) {
  3. //创建一个对象
  4. User user1=new User("刘也1号",1,"男");
  5. User user2=new User("刘也2号",1,"男");
  6. User user3=new User("刘也3号",1,"男");
  7. User user4=new User("刘也4号",1,"男");
  8. User user5=new User("刘也5号",1,"男");
  9. List<User> list=new ArrayList<User>();
  10. list.add(user1);
  11. list.add(user2);
  12. list.add(user3);
  13. list.add(user4);
  14. list.add(user5);
  15. System.out.println("========Java对象转JSON字符串===========");
  16. String str1= JSON.toJSONString(list);
  17. System.out.println("JSON.toJSONString(list)==>"+str1);
  18. String str2=JSON.toJSONString(user1);
  19. System.out.println("JSON.toJSONString(user1)==>"+str2);
  20. System.out.println("\n=======JSON字符串转Java对象=========");
  21. User jp_user1=JSON.parseObject(str2,User.class);
  22. System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
  23. System.out.println("\n=========== Java对象 转 JSON对象 ==========");
  24. JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
  25. System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
  26. System.out.println("\n=========== JSON对象 转 Java对象 ============");
  27. User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
  28. System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
  29. }
  30. }

SpringMVC学习笔记02 - 图17

这种工具类,我们只需要掌握使用就好了,在使用的时候再根据具体的业务去找对应的实现,和以前的commons-io那种工具包一样,拿来用就好了

3.整合SSM框架

环境要求

  • IDEA
  • Mysql 8.0
  • Tomcat 9
  • Maven 3.5.0

要求

  • 需要熟练掌握Mysql数据库,Spring,JavaWeb及Mybatis,简单的前端知识

3.1 数据库环境

创建一个存放书籍数据的数据库表

  1. CREATE DATABASE `ssmbuild`;
  2. USE `ssmbuild`;
  3. DROP TABLE IF EXISTS `books`;
  4. CREATE TABLE `books` (
  5. `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
  6. `bookName` VARCHAR(100) NOT NULL COMMENT '书名',
  7. `bookCounts` INT(11) NOT NULL COMMENT '数量',
  8. `detail` VARCHAR(200) NOT NULL COMMENT '描述',
  9. KEY `bookID` (`bookID`)
  10. ) ENGINE=INNODB DEFAULT CHARSET=utf8
  11. INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
  12. (1,'Java',1,'从入门到放弃'),
  13. (2,'MySQL',10,'从删库到跑路'),
  14. (3,'Linux',5,'从进门到进牢');

3.2 基本环境搭建

  1. 新建一个maven项目ssmbuild-books,添加web的支持
  2. 导入相关的pom依赖
  1. <!--导入依赖-->
  2. <dependencies>
  3. <!-- mysql驱动-->
  4. <dependency>
  5. <groupId>mysql</groupId>
  6. <artifactId>mysql-connector-java</artifactId>
  7. <version>8.0.11</version>
  8. </dependency>
  9. <!-- 数据库连接池-->
  10. <dependency>
  11. <groupId>com.mchange</groupId>
  12. <artifactId>c3p0</artifactId>
  13. <version>0.9.5.2</version>
  14. </dependency>
  15. <!-- mybatis-->
  16. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  17. <dependency>
  18. <groupId>org.mybatis</groupId>
  19. <artifactId>mybatis</artifactId>
  20. <version>3.5.2</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.mybatis</groupId>
  24. <artifactId>mybatis-spring</artifactId>
  25. <version>2.0.3</version>
  26. </dependency>
  27. <!--junit-->
  28. <dependency>
  29. <groupId>junit</groupId>
  30. <artifactId>junit</artifactId>
  31. <version>4.12</version>
  32. </dependency>
  33. <!--Servlet - JSP -->
  34. <dependency>
  35. <groupId>javax.servlet</groupId>
  36. <artifactId>servlet-api</artifactId>
  37. <version>2.5</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>javax.servlet.jsp</groupId>
  41. <artifactId>jsp-api</artifactId>
  42. <version>2.2</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>javax.servlet</groupId>
  46. <artifactId>jstl</artifactId>
  47. <version>1.2</version>
  48. </dependency>
  49. <!--Spring-->
  50. <dependency>
  51. <groupId>org.springframework</groupId>
  52. <artifactId>spring-webmvc</artifactId>
  53. <version>5.1.10.RELEASE</version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework</groupId>
  57. <artifactId>spring-jdbc</artifactId>
  58. <version>5.1.10.RELEASE</version>
  59. </dependency>
  60. <!--lombok-->
  61. <dependency>
  62. <groupId>org.projectlombok</groupId>
  63. <artifactId>lombok</artifactId>
  64. <version>1.18.10</version>
  65. </dependency>
  66. </dependencies>
  1. Maven资源过滤设置
  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/java</directory>
  5. <includes>
  6. <include>**/*.properties</include>
  7. <include>**/*.xml</include>
  8. </includes>
  9. <filtering>false</filtering>
  10. </resource>
  11. <resource>
  12. <directory>src/main/resources</directory>
  13. <includes>
  14. <include>**/*.properties</include>
  15. <include>**/*.xml</include>
  16. </includes>
  17. <filtering>false</filtering>
  18. </resource>
  19. </resources>
  20. </build>
  1. 建立基本结构和配置框架
  • com.jcsune.pojo
  • com.jcsune.dao
  • com.jcsune.service
  • com.jcsune.controller
  • mybatis-config.xml
  • applicationContext.xml

3.3 Mybatis层编写

  1. 数据库配置文件
  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
  3. jdbc.username=root
  4. jdbc.password=321074

注意:第三行不能只写username,否则spring读取配置文件会把username看作操作系统的username,导致最后整合完后,Tomcat连接不上数据库

  1. IDEA关联数据库

SpringMVC学习笔记02 - 图18

  1. 编写mybatis的核心配置文件
  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. <configuration>
  6. <typeAliases>
  7. <package name="com.jcsune.pojo"/>
  8. </typeAliases>
  9. <mappers>
  10. <mapper resource="BookMapper.xml"/>
  11. </mappers>
  12. </configuration>
  1. 编写数据库对应的实体类 com.jcsune.pojo.Books 使用Lombok插件
  1. package com.jcsune.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class Books {
  9. private int bookID;
  10. private String bookName;
  11. private int bookCounts;
  12. private String detail;
  13. }
  1. 编写DAO层的Mapper接口
  1. package com.jcsune.dao;
  2. import com.jcsune.pojo.Books;
  3. import java.util.List;
  4. public interface BookMapper {
  5. //增加一个Book
  6. int addBook(Books book);
  7. //根据id删除一个Book
  8. int deleteBookById(int id);
  9. //更新Book
  10. int updateBook(Books books);
  11. //根据id查询返回一个Book
  12. Books queryBookById(int id);
  13. //查询全部Book,返回list集合
  14. List<Books> queryAllBook();
  15. }
  1. 编写接口对应的Mapper.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.jcsune.dao.BookMapper">
  6. <!--增加一个Book-->
  7. <insert id="addBook" parameterType="Books">
  8. insert into ssmbuild.books(bookName,bookCounts,detail)
  9. values (#{bookName}, #{bookCounts}, #{detail})
  10. </insert>
  11. <!--根据id删除一个Book-->
  12. <delete id="deleteBookById" parameterType="int">
  13. delete from ssmbuild.books where bookID=#{bookID}
  14. </delete>
  15. <!--更新Book-->
  16. <update id="updateBook" parameterType="Books">
  17. update ssmbuild.books
  18. set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}
  19. where bookID = #{bookID}
  20. </update>
  21. <!--根据id查询,返回一个Book-->
  22. <select id="queryBookById" resultType="Books">
  23. select * from ssmbuild.books
  24. where bookID = #{bookID}
  25. </select>
  26. <!--查询全部Book-->
  27. <select id="queryAllBook" resultType="Books">
  28. SELECT * from ssmbuild.books
  29. </select>
  30. </mapper>
  1. 编写service层的接口和实现类

接口:

  1. package com.jcsune.service;
  2. import com.jcsune.pojo.Books;
  3. import java.util.List;
  4. //BookService:底下需要去实现调用dao层
  5. public interface BookService {
  6. //增加一个Book
  7. int addBook(Books book);
  8. //根据id删除一个Book
  9. int deleteBookById(int id);
  10. //更新Book
  11. int updateBook(Books books);
  12. //根据id查询返回一个Book
  13. Books queryBookById(int id);
  14. //查询全部Book,返回list集合
  15. List<Books> queryAllBook();
  16. }

实现类:

  1. package com.jcsune.service;
  2. import com.jcsune.dao.BookMapper;
  3. import com.jcsune.pojo.Books;
  4. import java.util.List;
  5. public class BookServiceImpl implements BookService {
  6. //调用dao层的操作,设置一个set接口,方便Spring管理
  7. private BookMapper bookMapper;
  8. public void setBookMapper(BookMapper bookMapper){
  9. this.bookMapper=bookMapper;
  10. }
  11. public int addBook(Books book) {
  12. return bookMapper.addBook(book);
  13. }
  14. public int deleteBookById(int id) {
  15. return bookMapper.deleteBookById(id);
  16. }
  17. public int updateBook(Books books) {
  18. return bookMapper.updateBook(books);
  19. }
  20. public Books queryBookById(int id) {
  21. return bookMapper.queryBookById(id);
  22. }
  23. public List<Books> queryAllBook() {
  24. return bookMapper.queryAllBook();
  25. }
  26. }

到此,底层需求操作完毕!!

3.4 Spring层

  1. 配置spring整合mybatis,我们这里数据源使用c3p0连接池
  2. 编写spring整合mybatis的相关配置文件: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. http://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. <!-- 配置整合mybatis -->
  10. <!-- 1.关联数据库文件 -->
  11. <context:property-placeholder location="classpath:database.properties"/>
  12. <!-- 2.数据库连接池 -->
  13. <!--数据库连接池
  14. dbcp 半自动化操作 不能自动连接
  15. c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
  16. -->
  17. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  18. <!-- 配置连接池属性 -->
  19. <property name="driverClass" value="${jdbc.driver}"/>
  20. <property name="jdbcUrl" value="${jdbc.url}"/>
  21. <property name="user" value="${jdbc.username}"/>
  22. <property name="password" value="${jdbc.password}"/>
  23. <!-- c3p0连接池的私有属性 -->
  24. <property name="maxPoolSize" value="30"/>
  25. <property name="minPoolSize" value="10"/>
  26. <!-- 关闭连接后不自动commit -->
  27. <property name="autoCommitOnClose" value="false"/>
  28. <!-- 获取连接超时时间 -->
  29. <property name="checkoutTimeout" value="10000"/>
  30. <!-- 当获取连接失败重试次数 -->
  31. <property name="acquireRetryAttempts" value="2"/>
  32. </bean>
  33. <!-- 3.配置SqlSessionFactory对象 -->
  34. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  35. <!-- 注入数据库连接池 -->
  36. <property name="dataSource" ref="dataSource"/>
  37. <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
  38. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  39. </bean>
  40. <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
  41. <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
  42. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  43. <!-- 注入sqlSessionFactory -->
  44. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  45. <!-- 给出需要扫描Dao接口包 -->
  46. <property name="basePackage" value="com.jcsune.dao"/>
  47. </bean>
  48. </beans>
  1. Spring整合service层

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. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 扫描service相关的bean -->
  10. <context:component-scan base-package="com.jcsune.service" />
  11. <!--BookServiceImpl注入到IOC容器中-->
  12. <bean id="BookServiceImpl" class="com.jcsune.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>

Spring层搞定这里可以更加深刻理解spring就是一个容器的概念

3.5 SpringMVC层

  1. web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!--DispatcherServlet-->
  7. <servlet>
  8. <servlet-name>DispatcherServlet</servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10. <init-param>
  11. <param-name>contextConfigLocation</param-name>
  12. <!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!-->
  13. <param-value>classpath:applicationContext.xml</param-value>
  14. </init-param>
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>DispatcherServlet</servlet-name>
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>
  21. <!--encodingFilter-->
  22. <filter>
  23. <filter-name>encodingFilter</filter-name>
  24. <filter-class>
  25. org.springframework.web.filter.CharacterEncodingFilter
  26. </filter-class>
  27. <init-param>
  28. <param-name>encoding</param-name>
  29. <param-value>utf-8</param-value>
  30. </init-param>
  31. </filter>
  32. <filter-mapping>
  33. <filter-name>encodingFilter</filter-name>
  34. <url-pattern>/*</url-pattern>
  35. </filter-mapping>
  36. <!--Session过期时间-->
  37. <session-config>
  38. <session-timeout>15</session-timeout>
  39. </session-config>
  40. </web-app>
  1. spring-mvc.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. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://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. <!-- 配置SpringMVC -->
  13. <!-- 1.开启SpringMVC注解驱动 -->
  14. <mvc:annotation-driven />
  15. <!-- 2.静态资源默认servlet配置-->
  16. <mvc:default-servlet-handler/>
  17. <!-- 3.配置jsp 显示ViewResolver视图解析器 -->
  18. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  19. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  20. <property name="prefix" value="/WEB-INF/jsp/" />
  21. <property name="suffix" value=".jsp" />
  22. </bean>
  23. <!-- 4.扫描web相关的bean -->
  24. <context:component-scan base-package="com.jcsune.controller" />
  25. </beans>
  1. spring配置整合文件 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="spring-dao.xml"/>
  7. <import resource="spring-service.xml"/>
  8. <import resource="spring-mvc.xml"/>
  9. </beans>
  1. Controller和视图层编写
  • BookController类编写
  1. package com.jcsune.controller;
  2. import com.jcsune.pojo.Books;
  3. import com.jcsune.service.BookService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import java.util.List;
  11. @Controller
  12. @RequestMapping("/book")
  13. public class BookController {
  14. @Autowired
  15. @Qualifier("BookServiceImpl")
  16. private BookService bookService;
  17. @RequestMapping("/allBook")
  18. public String list(Model model) {
  19. List<Books> list = bookService.queryAllBook();
  20. model.addAttribute("list", list);
  21. return "allBook";
  22. }
  23. @RequestMapping("/toAddBook")
  24. public String toAddPaper() {
  25. return "addBook";
  26. }
  27. @RequestMapping("/addBook")
  28. public String addPaper(Books books) {
  29. System.out.println(books);
  30. bookService.addBook(books);
  31. return "redirect:/book/allBook";
  32. }
  33. @RequestMapping("/toUpdateBook")
  34. public String toUpdateBook(Model model, int id) {
  35. Books books = bookService.queryBookById(id);
  36. System.out.println(books);
  37. model.addAttribute("book",books );
  38. return "updateBook";
  39. }
  40. @RequestMapping("/updateBook")
  41. public String updateBook(Model model, Books book) {
  42. System.out.println(book);
  43. bookService.updateBook(book);
  44. Books books = bookService.queryBookById(book.getBookID());
  45. model.addAttribute("books", books);
  46. return "redirect:/book/allBook";
  47. }
  48. @RequestMapping("/del/{bookId}")
  49. public String deleteBook(@PathVariable("bookId") int id) {
  50. bookService.deleteBookById(id);
  51. return "redirect:/book/allBook";
  52. }
  53. }
  • 首页 index.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>首页</title>
  5. <style type="text/css">
  6. a {
  7. text-decoration: none;
  8. color: black;
  9. font-size: 18px;
  10. }
  11. h3 {
  12. width: 180px;
  13. height: 38px;
  14. margin: 100px auto;
  15. text-align: center;
  16. line-height: 38px;
  17. background: deepskyblue;
  18. border-radius: 4px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <h3>
  24. <a href="${pageContext.request.contextPath}/book/allBook">点击进入列表页</a>
  25. </h3>
  26. </body>
  27. </html>
  • 书籍列表页面 allBook.jsp
  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>书籍列表</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <!-- 引入 Bootstrap -->
  8. <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <div class="row clearfix">
  13. <div class="col-md-12 column">
  14. <div class="page-header">
  15. <h1>
  16. <small>书籍列表 —— 显示所有书籍</small>
  17. </h1>
  18. </div>
  19. </div>
  20. </div>
  21. <div class="row">
  22. <div class="col-md-4 column">
  23. <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
  24. </div>
  25. </div>
  26. <div class="row clearfix">
  27. <div class="col-md-12 column">
  28. <table class="table table-hover table-striped">
  29. <thead>
  30. <tr>
  31. <th>书籍编号</th>
  32. <th>书籍名字</th>
  33. <th>书籍数量</th>
  34. <th>书籍详情</th>
  35. <th>操作</th>
  36. </tr>
  37. </thead>
  38. <tbody>
  39. <c:forEach var="book" items="${requestScope.get('list')}">
  40. <tr>
  41. <td>${book.getBookID()}</td>
  42. <td>${book.getBookName()}</td>
  43. <td>${book.getBookCounts()}</td>
  44. <td>${book.getDetail()}</td>
  45. <td>
  46. <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
  47. <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a>
  48. </td>
  49. </tr>
  50. </c:forEach>
  51. </tbody>
  52. </table>
  53. </div>
  54. </div>
  55. </div>
  56. </body>
  57. </html>
  • 添加书籍页面 addBook.jsp
  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>新增书籍</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <!-- 引入 Bootstrap -->
  8. <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <div class="row clearfix">
  13. <div class="col-md-12 column">
  14. <div class="page-header">
  15. <h1>
  16. <small>新增书籍</small>
  17. </h1>
  18. </div>
  19. </div>
  20. </div>
  21. <form action="${pageContext.request.contextPath}/book/addBook" method="post">
  22. 书籍名称:<input type="text" name="bookName"><br><br><br>
  23. 书籍数量:<input type="text" name="bookCounts"><br><br><br>
  24. 书籍详情:<input type="text" name="detail"><br><br><br>
  25. <input type="submit" value="添加">
  26. </form>
  27. </div>
  28. </body>
  29. </html>
  • 修改书籍页面
  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>修改信息</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <!-- 引入 Bootstrap -->
  8. <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <div class="row clearfix">
  13. <div class="col-md-12 column">
  14. <div class="page-header">
  15. <h1>
  16. <small>修改信息</small>
  17. </h1>
  18. </div>
  19. </div>
  20. </div>
  21. <form action="${pageContext.request.contextPath}/book/updateBook" method="post">
  22. <input type="hidden" name="bookID" value="${book.getBookID()}"/>
  23. 书籍名称:<input type="text" name="bookName" value="${book.getBookName()}"/>
  24. 书籍数量:<input type="text" name="bookCounts" value="${book.getBookCounts()}"/>
  25. 书籍详情:<input type="text" name="detail" value="${book.getDetail() }"/>
  26. <input type="submit" value="提交"/>
  27. </form>
  28. </div>
  29. </body>
  30. </html>

配置Tomcat进行运行

首页:

SpringMVC学习笔记02 - 图19

书籍列表页面:

SpringMVC学习笔记02 - 图20

添加书籍页面:

SpringMVC学习笔记02 - 图21

修改书籍页面:

SpringMVC学习笔记02 - 图22

项目结构图:

SpringMVC学习笔记02 - 图23

SpringMVC学习笔记02 - 图24