SpringMVC(二)

逃离我推掉我的手 2023-05-29 03:22 69阅读 0赞

1 ResponseBody 和 RequestBody

1.1 简介

  • @ResponseBody 把后台 pojo 转换 json 对象,返回到页面;
  • @RequestBody 接受前台 json 数据,把 json 数据自动封装 javaBean

1.2 使用

案例:请求和相应都是 json 数据

第一步:导入 json 的 jar

在这里插入图片描述

第二步:

添加个json转换器

配置文件

在这里插入图片描述

第三步:写个 jsp 页面,提交 json 请求参数

在这里插入图片描述
在这里插入图片描述

第四步:后台处理

注意学生类一定要提供无参的构造方法
在这里插入图片描述
在这里插入图片描述

案例:只有响应 json 数据

第一步:表单

在这里插入图片描述

第二步:后台处理

在这里插入图片描述

2 SpringMVC 多视图

多视图是一个方法可以返回json/xml等格式的数据

第一步:导入 xml 格式支持的 jar 包

在这里插入图片描述

第二步:配置支持多视图

  1. <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  2. <!-- 配置支持媒体类型 -->
  3. <property name="contentNegotiationManager">
  4. <bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  5. <property name="mediaTypes">
  6. <map>
  7. <entry key="json" value="application/json"></entry>
  8. <entry key="xml" value="application/xml"></entry>
  9. </map>
  10. </property>
  11. </bean>
  12. </property>
  13. <!-- 指定默认视图 -->
  14. <property name="defaultViews">
  15. <!-- 支持多个视图 -->
  16. <list>
  17. <!-- 对josn格式视图支持 -->
  18. <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
  19. <!-- xml格式视图支持 -->
  20. <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
  21. <constructor-arg>
  22. <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  23. <property name="classesToBeBound">
  24. <list>
  25. <value>com.gyf.backoffice.domain.Student</value>
  26. </list>
  27. </property>
  28. </bean>
  29. </constructor-arg>
  30. </bean>
  31. </list>
  32. </property>
  33. </bean>

第三步:控制器提供一个接口

注意学生对象需要声明一个注解
在这里插入图片描述
在这里插入图片描述

第四步:测试

在这里插入图片描述
在这里插入图片描述

3 eclipse 安装 spring 提示插件

3.1 在应用市场搜索 spring tools

点击Eclipse的Help 下的 Eclipse Marketplace搜索spring tools,然后红色不用勾选,点下一步安装插件
在这里插入图片描述
在这里插入图片描述

3.2 依次点开菜单‘XML -> XMLFiles -> Editor -> Content Assist’配置

如下图:
在这里插入图片描述

3.3 使用下面两种文件打开配置文件

在xml中使用. + /就会有类提示
在这里插入图片描述

4 SSM 整合

Spring + SpringMVC + Mybatis整合

4.1 导入jar包

  • Spring+ SpringMVC + MyBatis + Mybatis-spring整合包
  • AOP联盟+织入 + c3p0 数据库连接池 + MySQL连接驱动 + jstl
    在这里插入图片描述

4.2 创建一个 SpringMVC 文件

  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" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
  16. <!-- 1.配置注解扫描位置 -->
  17. <context:component-scan base-package="com.gyf.backoffice.web.controller" />
  18. <!-- 2.配置注解处理映射-->
  19. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  20. <!--3.配置适配器-->
  21. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  22. </bean>
  23. <!-- 4.配置springmvc视图解析器 视图解析器解析的视频路径为:前缀 + 后缀 -->
  24. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  25. <property name="prefix" value="/WEB-INF/views" />
  26. <property name="suffix" value=".jsp" />
  27. </bean>
  28. </beans>

4.3 在 web.xml 添加 springmvc 配置

这次我们更改默认的springmvc配置文件路径
在这里插入图片描述

  1. <servlet>
  2. <servlet-name>DispatcherServlet</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <!-- 3.0的springmvc 默认加载WEB-INF下的dispatcher-servlet.xml文件 3.2的springmvc 加载DispatcherServlet-servlet.xml文件 -->
  5. <init-param>
  6. <!-- 修改黑底springmvc加载的配置文件路径 -->
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:springmvc.xml</param-value>
  9. </init-param>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>DispatcherServlet</servlet-name>
  14. <url-pattern>*.do</url-pattern>
  15. </servlet-mapping>

4.4 先配置一个 Controller 跑出一个页面

在这里插入图片描述
在这里插入图片描述

4.5 通过MyBatis的逆向工程生成JavaBean/Mapper

把生成的文件导入当到项目,步骤不记得可以参数MyBatis的博客
在这里插入图片描述

4.6 修改 ItemsMapper.java 和 ItemsMapper.xml

在这里插入图片描述
在这里插入图片描述

4.7 定义 Service 层 接口并实现

在这里插入图片描述
在这里插入图片描述

4.8 配置 SqlMappingConfig.xml、mybatis

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <!-- 别名配置 -->
  5. <typeAliases>
  6. <!-- 批量配置别名:指定批量定义别名的类包,别名为类名(首字母大小写都可) -->
  7. <package name="com.gyf.backoffice.domain"/>
  8. </typeAliases>
  9. <mappers>
  10. <!-- 批量加载映射文件 -->
  11. <package name="com.gyf.backoffice.mapper"/>
  12. </mappers>
  13. </configuration>

4.9 创建 spring 的 applicationContext.xml

配置数据源和mybaties的session工厂

  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:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
  15. </beans>

4.10 配置 c3p0 数据源和 mybatis 的会话工厂

  1. <!-- 1.加载db配置文件 -->
  2. <context:property-placeholder location="classpath:db.properties"/>
  3. <!-- 2.配置c3p0数据源 -->
  4. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  5. <property name="driverClass" value="${jdbc.driver}"/>
  6. <property name="jdbcUrl" value="${jdbc.url}"/>
  7. <property name="user" value="${jdbc.username}"/>
  8. <property name="password" value="${jdbc.password}"/>
  9. <property name="maxPoolSize" value="30"/>
  10. <property name="minPoolSize" value="2"/>
  11. </bean>
  12. <!-- 3.让spring管理sqlsessionFactory -->
  13. <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
  14. <property name="dataSource" ref="dataSource"/>
  15. <!-- 指定配置文件位置 -->
  16. <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
  17. </bean>
  18. <!-- 4.配置mapper扫描器.批量扫描创建代理对象 -->
  19. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  20. <property name="basePackage" value="com.gyf.backoffice.mapper"/>
  21. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
  22. </bean>
  23. db文件内容
  24. jdbc.driver=com.mysql.jdbc.Driver
  25. jdbc.url=jdbc:mysql://localhost:3306/mybatis
  26. jdbc.username=root
  27. jdbc.password=123456

4.11 Web.xml 配置 spring 容器

  1. <!-- spring的配置 -->
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath:applicationContext.xml</param-value>
  5. </context-param>
  6. <listener>
  7. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  8. </listener>

4.12 添加 bean 的注解装配

  1. <!-- 配置扫描注解 -->
  2. <context:component-scan base-package="com.gyf.backoffice"/>

4.13 ItemsService

在这里插入图片描述

4.14 ItemsController

在这里插入图片描述

4.15 事务配置

Spring中Propagation类的事务属性详解:

  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务

    1. <property name="dataSource" ref="dataSource"/>

    1. <tx:advice id="txAdvice" transaction-manager="transactionManager">
    2. <tx:attributes>
    3. <!-- 传播行为 -->
    4. <tx:method name="save*" propagation="REQUIRED"/>
    5. <tx:method name="insert*" propagation="REQUIRED"/>
    6. <tx:method name="delete*" propagation="REQUIRED"/>
    7. <tx:method name="update*" propagation="REQUIRED"/>
    8. <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    9. <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    10. </tx:attributes>
    11. </tx:advice>
    12. <!-- 7. 切面 -->
    13. <aop:config>
    14. <aop:advisor advice-ref="txAdvice"
    15. pointcut="execution(* com.gyf.backoffice.service.*.*(..))"/>
    16. </aop:config>

    1. <property name="dataSource" ref="dataSource"/>

4.16 添加一个保存方法测试事务

  • service
    在这里插入图片描述
  • controller
    在这里插入图片描述

5 增删改查任务

5.1 显示商品数据

在这里插入图片描述

  • Controller.java
    在这里插入图片描述
  • Views/items/list.jsp
    在这里插入图片描述

5.2 删除商品

  • Service
    在这里插入图片描述
  • Controller
    在这里插入图片描述

5.3 显示编辑商品页面

在这里插入图片描述

  • Controller
    在这里插入图片描述
  • Edit.jsp
    在这里插入图片描述

5.4 更新商品

需要在页面中隐藏一个input标签存id
在这里插入图片描述
乱码,在web.xml配置

  1. <!-- 配置编码过滤器 -->
  2. <filter>
  3. <filter-name>EncodingFilter</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>EncodingFilter</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>
  • controller
    在这里插入图片描述
  • Service:需要改下逻辑
    在这里插入图片描述

6 文件上传

在这里插入图片描述

6.1 导包

在这里插入图片描述
在这里插入图片描述

6.2 Springmvc.xml配置支持文件上传

在这里插入图片描述

6.3 html/js

在这里插入图片描述
在这里插入图片描述

6.4 后台

  1. @Controller
  2. @RequestMapping("upload")
  3. public class UploadController {
  4. @RequestMapping("itemsPic")
  5. public void itemsPic(HttpServletRequest request,String fileName, PrintWriter writer) throws Exception{
  6. MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
  7. //通过字段名获取文件数据
  8. MultipartFile file1 = mulRequest.getFile(fileName);
  9. System.out.println(fileName + ":上传文件大小 " + file1.getSize());
  10. //格式化文件名
  11. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
  12. String saveName = sdf.format(new Date());
  13. Random rd = new Random();
  14. for(int i=0;i<3;i++){
  15. saveName += rd.nextInt(10);//添加三个随机数
  16. }
  17. //文件后缀名
  18. String suffix = file1.getOriginalFilename().split("\\.")[1];
  19. String saveFileName = saveName + "." + suffix;
  20. //文件保存目录
  21. String dir = request.getServletContext().getRealPath("/upload");
  22. File dirFile = new File(dir);
  23. if(dirFile.exists() == false)dirFile.mkdirs();
  24. //文件保存路径
  25. String relativePath = "/upload/" + saveFileName;
  26. String totalPath = request.getServletContext().getRealPath(relativePath);
  27. System.out.println(totalPath);
  28. File newFile = new File(totalPath);
  29. //保存
  30. FileCopyUtils.copy(file1.getInputStream(), new FileOutputStream(newFile));
  31. Thread.sleep(2000);
  32. //file1.transferTo(newFile);
  33. //返回一个相对路径 相对路径和全路径
  34. String serverIp = "http://127.0.0.1:8080" + request.getServletContext().getContextPath();
  35. String respJson = "{\"imgUrl\":\"" + serverIp + relativePath+"\"}";
  36. writer.write(respJson);
  37. }
  38. }

7 Oscache 页面缓存

7.1 页面缓存测试

7.1.1 导包

在这里插入图片描述

7.1.2 测试

创建一个index.jsp页面,使用时间来测试
在这里插入图片描述

7.1.3 知识点

缓存数据结构:map,key存储浏览器访问url,如果访问2个url不一致,缓存肯定变化。

缓存的作用域

缓存默认存储在application域当中,可更改缓存数据。
在这里插入图片描述
这样,不同浏览器访问时,缓存时间是不一样的,如果是application,不同浏览器访问同一个路径时,时间是一样的

缓存刷新时间

在这里插入图片描述

固定存储的 Key

在这里插入图片描述

缓存持久化

创建oscache.properties这个配置文件必须在classpath下面:
在这里插入图片描述
内容

  1. cache.memory=false
  2. cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
  3. cache.path=C:\\test

访问路径后会在test的application中创建缓存文件
在这里插入图片描述

8 Oscache 整合 ssm 项目

约定:商品页面访问量特别大,给商品页面缓存。Items路径下所有请求都缓存。

在 web.xml 中配置页面缓存

  1. <!-- 配置页面缓存 -->
  2. <filter>
  3. <filter-name>oscache</filter-name>
  4. <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
  5. <init-param>
  6. <param-name>time</param-name>
  7. <param-value>3600</param-value>
  8. </init-param>
  9. <init-param>
  10. <param-name>scope</param-name>
  11. <param-value>application</param-value>
  12. </init-param>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>oscache</filter-name>
  16. <url-pattern>/items/*</url-pattern>
  17. </filter-mapping>

第一次访问Items下面的页面,控制器方法会执行,第一次就走缓存页面

如图,把持久化缓存加到项目中,缓存的数据是一个页面
在这里插入图片描述

  1. cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
  2. cache.path=C:\\test

9 SpringMVC 整合 freemarker

9.1 简介:freemark

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。

  • https://freemarker.apache.org/
  • http://freemarker.foofun.cn
  • 模型引擎框架还有:https://www.thymeleaf.org/

9.2 导包

在这里插入图片描述
在这里插入图片描述

9.3 SpringMVC 配置 freemark

  1. <!-- 配置freemarker -->
  2. <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  3. <property name="templateLoaderPath" value="/WEB-INF/views" />
  4. <property name="defaultEncoding" value="UTF-8"></property>
  5. </bean>
  6. <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  7. <property name="contentType" value="text/html;charset=utf-8"/>
  8. <property name="suffix" value=".ftl" />
  9. </bean>

9.4 写一个 hello.ftl 模板

在这里插入图片描述

9.5 ItemsController

在这里插入图片描述

9.6 测试结果

数据就通过模板引擎生成了
在这里插入图片描述

9.7 list.jsp 改成 list.ftl

在这里插入图片描述
掌握freemark的两个表达工:
赋值
<#assign/>
遍历
<#list xxList as xx>

${item.createtime?string(“yyyy-MM-dd HH:mm:ss zzzz”)}

10 SpringMVC 的拦截器

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

10.1 登录拦截器

  1. public class LoginInterceptor implements HandlerInterceptor{
  2. //controller执行后且视图返回后调用此方法
  3. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  4. throws Exception {
  5. System.out.println("返回视图前 后处理");
  6. }
  7. //controller执行后但未返回视图前调用此方法
  8. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  9. throws Exception {
  10. System.out.println("未返回视图前 后处理....");
  11. }
  12. // controller执行前调用此方法
  13. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
  14. // TODO Auto-generated method stub
  15. System.out.println("预处理....");
  16. //如果是登录页面则放行
  17. if(request.getRequestURI().indexOf("login.do")>=0){
  18. return true;
  19. }
  20. HttpSession session = request.getSession();
  21. //如果用户已登录也放行
  22. if(session.getAttribute("user")!=null){
  23. return true;
  24. }
  25. //用户没有登录挑战到登录页面
  26. request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
  27. return false;
  28. }
  29. }

10.2 登录控制器

在这里插入图片描述

10.3 登录界面

在这里插入图片描述

10.4 登录拦截器配置

在这里插入图片描述
总结拦截注意点:

  • 拦截所有的请求,使用/**,有两个**
  • 如果拦截的路径在项目不存在,直接报错

发表评论

表情:
评论列表 (有 0 条评论,69人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC详解(

    通过上篇博客,我们能编写一个 SpringMVC 的入门实例,但是为什么要这样写?这样写有啥好处?通过这篇博客我们会有详细的了解。   本篇博客源码下载链接:http://d

    相关 SpringMVC学习(

    文件的上传与下载: 1.导入jar包 2.配置多媒体解析器 3.书写controller 一:要明白,每次涉及文件上传与下载的时候都有三要素。 file控件,po