【SSM】SSM整合笔记(Spring+SpringMVC+Mybatis)(2w5字+)

SSM整合笔记(Spring+SpringMVC+Mybatis)



IDE: IntelliJ IDEA 2020.2

零 l  写在前面


1、以初学者的视角记录笔记
2、课程链接:[链接]
3、资料链接:[笔记对应课程的配套资料],提取码:invv
4、实操很重要!!!
5、前文链接:
[Spring入门笔记1][Spring入门笔记2][Spring入门笔记3]
[MyBatis入门笔记1][MyBatis入门笔记2]
[MVC设计模式简介]
[SpringMVC入门笔记1][SpringMVC入门笔记2]




一 l  搭框架——导包(项目名\web\WEB-INF\lib)


一




二 l  搭框架——配置SpringMVC


(一)配置springmvc.xml(项目名\config)

(就是把SpringMVC默认的DispatcherServlet-servlet.xml改个名字)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

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

    <!-- 2.配置映射处理和适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 3.视图的解析器 -->
    <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

(二)在web.xml添加springmvc配置(项目名\web\WEB-INF\web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    
    <!-- 配置springmvc-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 3.0的springmvc 默认加载WEB-INF下的dispatcher-servlet.xml文件
             3.2的springmvc 加载DispatcherServlet-servlet.xml文件 -->
        <init-param>
            <!-- 修改默认springmvc加载的配置文件路径 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <!-- 配置编码过滤器,防止乱码 -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

(三)【测试可不看】

1、配置一个控制器测试(项目名\src\com.gyf.backoffice.web.controller\UserController.java)

@Controller
@RequestMapping("user")
public class UserController {
    @RequestMapping("list")
    public String list(){
        return "user/list";
    }
}

2、配置控制器测试对应jsp(项目名\web\WEB-INF\views\user\list.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
</head>
<body>
用户列表用户列表用户列表用户列表
</body>
</html>

3、输入http://localhost:8080/user/list.do(根据自己tomcat的端口访问)




三 l  搭框架——配置Mybatis


(一)通过MyBatis的逆向工程生成JavaBean/Mapper

具体过程见[MyBatis入门笔记2]的第五部分

自动生成的文件在项目中位置如下:
三-一

(二)修改ItemsMapper.java和ItemsMapper.xml

(至少要在自动生成的基础上会自己修改)

public interface ItemsMapper {
    /**
     * 返回所有商品
     * @return
     */
    public List<Items> findAllItems();
    
    ...自动生成的方法...
}
<mapper>
  <select id="findAllItems" resultType="items">
    SELECT * FROM items;
  </select>
  
  ...自动生成的sql语句...
</mapper>

(三)定义Service层接口并实现

IItemsService.java(项目名\src\com.gyf.backoffice.service\IItemsService.java)

public interface IItemsService {
    public List<Items> findAllItems();
    public Items findById(Integer id);
    public void saveOrUpdate(Items items);
    public void deleteById(Integer id);
}

ItemsServiceImpl.java(项目名\src\com.gyf.backoffice.service.impl\ItemsServiceImpl.java)

@Service
@Transactional
public class ItemsServiceImpl implements IItemsService {
    @Autowired
    private ItemsMapper itemsMapper;

    @Override
    public List<Items> findAllItems() {
        return itemsMapper.findAllItems();
    }

    @Override
    public Items findById(Integer id) {
        return itemsMapper.selectByPrimaryKey(id);
    }

    @Override
    public void saveOrUpdate(Items items) {
        if(items.getId() ==  null){
            itemsMapper.insert(items);
        }else{
            itemsMapper.updateByPrimaryKeySelective(items);
        }
    }

    @Override
    public void deleteById(Integer id) {
        itemsMapper.deleteByPrimaryKey(id);
    }
}

(四)配置mybatis.xml(项目名\config\mybatis.xml)

(就是把Mybatis默认的SqlMappingConfig.xml改个名字)

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





四 l  搭框架——配置Spring


(一)配置db.properties(项目名\config\db.properties)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisday1?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

(二)配置applicationContext.xml(项目名\config\applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <context:property-placeholder location="classpath:db.properties"/>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="2"/>
    </bean>
    <!-- 配置sessionFactory -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定配置文件位置 -->
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

    <!-- mybatis自动生成dao、mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.gyf.backoffice.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
    </bean>
    
    <!-- 自动扫描注解 -->
    <context:component-scan base-package="com.gyf.backoffice"/>
    
    <!-- 配置事务 -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 开启事务注解 -->
    <tx:annotation-driven></tx:annotation-driven>
</beans>

(三)在web.xml添加springmvc配置(项目名\web\WEB-INF\web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <!-- 配置spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- 配置springmvc-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 3.0的springmvc 默认加载WEB-INF下的dispatcher-servlet.xml文件
             3.2的springmvc 加载DispatcherServlet-servlet.xml文件 -->
        <init-param>
            <!-- 修改默认springmvc加载的配置文件路径 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <!-- 配置编码过滤器,防止乱码 -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

(四)【测试可不看】

1、配置一个控制器测试(项目名\src\com.gyf.backoffice.web.controller\ItemsController.java)

@Controller
@RequestMapping("items")
public class ItemsController {
    @Autowired
    private IItemsService itemsService;

    @RequestMapping("list")
    public String list(Model model){
        List<Items> itemsList = itemsService.findAllItems();
        System.out.println(itemsList);
        return "items/list";
    }

(不用写jsp,直接看控制台输出)
2、输入http://localhost:8080/items/list.do(根据自己tomcat的端口访问)




五 l  增删改查任务


(一)控制器

ItemsController.java(项目名\src\com.gyf.backoffice.web.controller\ItemsController.java)

@Controller
@RequestMapping("items")
public class ItemsController {
    @Autowired
    private IItemsService itemsService;
    
    @RequestMapping("list")
    public String list(Model model){
        // 1.查数据
        List<Items> itemsList = itemsService.findAllItems();
        // 2.存数据
        model.addAttribute("itemsList",itemsList);
        return "items/list";
    }
    
    @RequestMapping("delete")
    public String delete(Integer id,Model model){
        // 保存数据
        itemsService.deleteById(id);
        // 转发调用list方法
        return "forward:list.do";
    }
    
    @RequestMapping("edit")
    public String edit(Integer id, Model model) {
        // 通过id找到商品
        Items items = itemsService.findById(id);
        System.out.println(items);
        if (items != null) {
            model.addAttribute("items", items);
        }
        return "items/edit";
    }
    
    @RequestMapping("update")
    public String update(Items items, Model model) {
        // 设置时间
        items.setCreatetime(new Date());
        itemsService.saveOrUpdate(items);
        return "forward:list.do";
    }
}

(二)jsp页面

list.jsp(项目名\web\WEB-INF\views\items\list.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>商品列表</title>
</head>
<body>
商品:<br>
<table border="1">
    <tr>
        <td>名称</td>
        <td>价格</td>
        <td>描述</td>
        <td>日期</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${itemsList}" var="items">
        <tr>
            <td>${items.name}</td>
            <td>${items.price}</td>
            <td>${items.detail}</td>
            <td>${items.createtime}</td>
            <td>
                <a href="${pageContext.request.contextPath}/items/delete.do?id=${items.id}">删除</a>
                &nbsp;<a href="${pageContext.request.contextPath}/items/edit.do?id=${items.id}">编辑</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

edit.jsp(项目名\web\WEB-INF\views\items\edit.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>编辑商品</title>
</head>
<body>
<form id="itemsForm" action="${pageContext.request.contextPath}/items/update.do" method="post">
<table border="1">
    <tr>
        <td>名称</td>
        <td>
            <input type="text" name="name" value="${items.name}"></td>
            <input type="hidden" name="id" value="${items.id}"></td>
    </tr>
    <tr>
        <td>价格</td>
        <td><input type="text" name="price" value="${items.price}"></td>
    </tr>
    <tr>
        <td>描述</td>
        <td><textarea cols="20" rows="5" name="detail">${items.detail}</textarea> </td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="更新">
        </td>
    </tr>
</table>
</form>
</body>
</html>





六 l  其他功能——图片上传


(一)添加两个.js插件

六-(一)

(二)配置springmvc.xml(项目名\config)

二(一) 的基础之上配置

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
    
    ...

    <!-- 4.文件上传,并限制文件上传大小
         注:一定要配置id,id的名字是固定的,multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2048000"/>
    </bean>
</beans>

(三)配置edit.jsp(完整文件)(项目名\web\WEB-INF\views\items\edit.jsp)

script必须用两个对应标签<script></script>,只有一个标签<script />会报错

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>编辑商品</title>
    <script src="${pageContext.request.contextPath}/js/jquery-1.8.3.js"></script>
    <script src="${pageContext.request.contextPath}/js/jquery.form.js"></script>
    <script>
        function submitImage() {
            //封装请求数据
            var options = {
                type:'post',
                // 提交表单以外的数据
                // data:{
                //     username:'gyf'
                // },
                dataType:'json',
                url:'${pageContext.request.contextPath}/upload/itemspic.do',
                success:function (respData) {
                    // var jsonObj = $.parseJSON(respData);
                    // 给id为pic的元素,的src属性赋值respData.imgUrl
                    $('#pic').attr('src',respData.imgUrl);
                    // 给id为hiddenPic的元素,的value属性赋值respData.imgUrl
                    $('#hiddenPic').val(respData.imgUrl)
                }
            }
            //提交表单
            $('#itemsForm').ajaxSubmit(options)
        }
    </script>
</head>
<body>
<form id="itemsForm" action="${pageContext.request.contextPath}/items/update.do" method="post">
<table border="1">
    <tr>
        <td>名称</td>
        <td>
            <input type="text" name="name" value="${items.name}"></td>
            <input type="hidden" name="id" value="${items.id}">
    </tr>
    <tr>
        <td>价格</td>
        <td><input type="text" name="price" value="${items.price}"></td>
    </tr>
    <tr>
        <td>描述</td>
        <td><textarea cols="20" rows="5" name="detail">${items.detail}</textarea> </td>
    </tr>
    <tr>
        <td>图片</td>
        <td>
            <img id="pic" src="${items.pic}" width="100px" height="100px">
            <!-- 图片改变的触发器 -->
            <input type="file" name="itemspic1" onchange="submitImage();">
            <!-- 使得更新图片后,能在页面立即更新 -->
            <input id="hiddenPic" type="hidden" name="pic" value="${items.pic}">
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="更新">
        </td>
    </tr>
</table>
</form>
</body>
</html>

(四)UploadController(项目名\src\com.gyf.backoffice.web.controller\UploadController.java)

图片一般保存在:项目名\out\artifacts\web_war_exploded\upload

@Controller
@RequestMapping("upload")
public class UploadController {
    /**
     * 商品图片的上传
     */
    @RequestMapping("itemspic")
    public void itemspic(HttpServletRequest request, HttpServletResponse response) throws Exception {
        MultipartHttpServletRequest  mutliRequest = (MultipartHttpServletRequest) request;
        
        //1.获取图片数据
        MultipartFile mfile = mutliRequest.getFile("itemspic1");

        // 2.把图片保存在某个路径
        // 2.1文件保存的文件夹路径
        String uploadFolder = request.getServletContext().getRealPath("/upload");
        File uploadFolderFile = new File(uploadFolder);
        if(!uploadFolderFile.exists()){
            uploadFolderFile.mkdirs();
        }

        // 2.2.保存文件
        // 获取图片后缀
        String suffix = mfile.getOriginalFilename().split("\\.")[1];
        // 文件名=随机id.后缀
        String fileName = UUID.randomUUID().toString().replace("-","") + "." + suffix;
        String totalPath = uploadFolder + "\\" + fileName;
        FileCopyUtils.copy(mfile.getInputStream(),new FileOutputStream(new File(totalPath)));

        // 返回数据给客户端
        // 根据自己的servlet端口设置
        String imgURL = "http://localhost:8080/upload/" + fileName;
        // 格式:{"imgUrl":"路径"}
        String responseJson = "{\"imgUrl\":\"" + imgURL  + "\"}";
        response.setHeader("content-type","text/json;charset=utf-8");
        response.getWriter().write(responseJson);
    }
}





七 l  其他功能——Oscache页面缓存


(一)快速介绍

页面缓存使用map存储元素,key存储浏览器访问url,value是页面中的属性。

如果访问2个url不一致,缓存肯定变化。

试用一下:

1、导包

1

2、测试

创建一个index.jsp页面,使用时间来测试**(缓存时间只会显示第一次记录的现在时间)**
2

3、缓存的作用域

缓存默认存储在application域当中,可更改缓存数据的作用域。

application时:不同浏览器访问同一个路径时,缓存时间是一样的。

session时:不同浏览器访问时,缓存时间不一样。
3

4、缓存刷新时间

4

5、固定存储的Key

5

6、缓存持久化(不缓存在内存,而是缓存在硬盘)

创建oscache.properties这个配置文件必须在classpath下面:
6-1
内容

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

访问路径后会在test的application中创建缓存文件
6-2

(二)整合进ssm中

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

1、在web.xml中配置页面缓存(完整文件)(项目名\web\WEB-INF\web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

    <!-- 配置spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 配置springmvc-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 3.0的springmvc 默认加载WEB-INF下的dispatcher-servlet.xml文件
             3.2的springmvc 加载DispatcherServlet-servlet.xml文件 -->
        <init-param>
            <!-- 修改默认springmvc加载的配置文件路径 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <!-- 配置编码过滤器  -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置页面缓存 -->
    <filter>
        <filter-name>oscache</filter-name>	<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
        <init-param>
            <param-name>time</param-name>
            <param-value>3600</param-value>
        </init-param>
        <init-param>
            <param-name>scope</param-name>
            <param-value>application</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>oscache</filter-name>
        <url-pattern>/items/list.do</url-pattern>
    </filter-mapping>
</web-app>
2、是否进行硬盘持久化看具体需求





八 l  其他功能——pringmvc整合freemarker(替代jsp文件)


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

[英文官网]
[中文官网]
模型引擎框架还有:https://www.thymeleaf.org/

freemark的几个常用表达式:
赋值:<#assign/>
遍历: <#list xxList as xx>
自定义时间格式:${item.createtime?string(“yyyy-MM-dd HH:mm:ss zzzz”)}

(一)配置springmvc.xml(完整文件)(项目名\config)

第三步配置jsp的要注释掉

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

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

    <!-- 2.配置映射处理和适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 3.视图的解析器 -->
    <!--<bean>
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>-->

    <!-- 4.文件上传,并限制文件上传大小
         注:一定要配置id,id的名字是固定的,multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2048000"/>
    </bean>
    
    <!-- 5.配置freemarker -->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/views/" />
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="contentType" value="text/html;charset=utf-8"/>
        <property name="suffix" value=".ftl" />
    </bean>
</beans>

(二)【测试可不看】写一个hello.ftl模板(项目名\web\WEB-INF\views\items\hello.ftl)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
${myname}
</body>
</html>

(三)【测试可不看】ItemsController.java(项目名F\src.com.gyf.backoffice.web.controller\ItemsController.java)

添加示例方法

@Controller
@RequestMapping("items")
public class ItemsController {
    @RequestMapping("hello")
    public String hello(Model model) {
        model.addAttribute("myname", "Java Go Go Go!");
        return "items/hello";
    }
}

(四)list.ftl(项目名\web\WEB-INF\views\items\list.ftl)

可以替代list.jsp

<html>
<head>
    <title>商品列表</title>
</head>
<body>
商品:------<br>
<table border="1">
    <tr>
        <td>名称</td>
        <td>价格</td>
        <td>描述</td>
        <td>日期</td>
        <td>操作</td>
    </tr>
    <#list itemsList as items>
        <tr>
            <td>${items.name}</td>
            <td>${items.price}</td>
            <td>${items.detail}</td>
            <td>${items.createtime?date}</td>
            <td>
                <a href="/items/delete.do?id=${items.id}">删除</a>
                &nbsp;<a href="/items/edit.do?id=${items.id}">编辑</a>
            </td>
        </tr>
    </#list>
</table>
</body>
</html>





九 l  其他功能——10 SpringMVC的拦截器


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

如果springmvc.xml注释了视图解析器记得把注释去掉,不然无法访问jsp文件。

(一)login.jsp(登录界面)(项目名\web\WEB-INF\views\login.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<form id="loginForm" action="${pageContext.request.contextPath}/login.do" method="post">
    <table border="1">
        <tr>
            <td>用户名</td>
            <td>
                <input type="text" name="username">
            </td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="text" name="password"></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="登录"></td>
        </tr>
    </table>
</form>
</body>
</html>

(二)main.jsp(模拟登录后界面)(项目名\web\WEB-INF\views\main.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页页面</title>
</head>
<body>
...........主页面
</body>
</html>

(三)LoginController.java(登录控制器)(项目名\src\com.gyf.backoffice.web.controller\LoginController.java)

@Controller
public class LoginController {
    @RequestMapping("login")
    public String login(String username, String password, HttpSession session){
        if("gyf".equals(username) && "123".equals(password)){
            //登录成功
            //1.保存session
            session.setAttribute("user",username);
            //2.进入主页面
            return "main";
        }
        return "login";
    }
}

(四)LoginInterceptor.java(登录拦截器)(项目名\src\com.gyf.backoffice.web.interceptor\LoginInterceptor.java)

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

        //拦截
        //1.排除不需要拦截路径
        System.out.println("客户端访问资源的路径:" + request.getRequestURI());
        if(request.getRequestURI().endsWith("login.do")){
            return true;//放行
        }

        //2.如果已经登录,也要放行
        if(request.getSession().getAttribute("user") != null){
            return true;
        }

        //3.进入到login页面
        request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request,response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("未返回视图前 后处理....");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("返回视图前  后处理");
    }
}

(五)springmvc.xml(配置拦截器)(项目名\config\springmvc.xml)

拦截所有的请求,使用/**,有两个**。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

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

    <!-- 2.配置映射处理和适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 3.视图的解析器 -->
    <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 4.文件上传,并限制文件上传大小
         注:一定要配置id,id的名字是固定的,multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2048000"/>
    </bean>

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 配置登录拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!-- 配置排除的路径 -->
            <!--<mvc:exclude-mapping path=""-->
            <bean class="com.gyf.backoffice.web.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

(六)index.jsp(首页转发)(项目名\web\index.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- 转发标签 --%>
<%-- 下两句是等效的 --%>
<%--<%
    request.getRequestDispatcher("WEB-INF/views/login.jsp").forward(request,response);
%>--%>
<jsp:forward page="WEB-INF/views/login.jsp"></jsp:forward>
</body>
</html>

(七)测试

在浏览器输入http://localhost:8080/user/list.do(根据自己tomcat的端口访问),若没有登录,则会跳转到登陆界面。

若没有登录,输入不存在的页面,不会跳转登录界面,而是直接报错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值