SSM整合笔记(Spring+SpringMVC+Mybatis)
- 零 l 写在前面
- 一 l 搭框架——导包(项目名\web\WEB-INF\lib)
- 二 l 搭框架——配置SpringMVC
- 三 l 搭框架——配置Mybatis
- 四 l 搭框架——配置Spring
- 五 l 增删改查任务
- 六 l 其他功能——图片上传
- 七 l 其他功能——Oscache页面缓存
- 八 l 其他功能——pringmvc整合freemarker(替代jsp文件)
- 九 l 其他功能——10 SpringMVC的拦截器
- (一)login.jsp(登录界面)(项目名\web\WEB-INF\views\login.jsp)
- (二)main.jsp(模拟登录后界面)(项目名\web\WEB-INF\views\main.jsp)
- (三)LoginController.java(登录控制器)(项目名\src\com.gyf.backoffice.web.controller\LoginController.java)
- (四)LoginInterceptor.java(登录拦截器)(项目名\src\com.gyf.backoffice.web.interceptor\LoginInterceptor.java)
- (五)springmvc.xml(配置拦截器)(项目名\config\springmvc.xml)
- (六)index.jsp(首页转发)(项目名\web\index.jsp)
- (七)测试
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&useUnicode=true&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>
<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、导包
2、测试
创建一个index.jsp页面,使用时间来测试**(缓存时间只会显示第一次记录的现在时间)**
3、缓存的作用域
缓存默认存储在application域当中,可更改缓存数据的作用域。
application时:不同浏览器访问同一个路径时,缓存时间是一样的。
session时:不同浏览器访问时,缓存时间不一样。
4、缓存刷新时间
5、固定存储的Key
6、缓存持久化(不缓存在内存,而是缓存在硬盘)
创建oscache.properties这个配置文件必须在classpath下面:
内容
cache.memory=false
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.path=C:\\test
访问路径后会在test的application中创建缓存文件
(二)整合进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网页、电子邮件、配置文件、源代码等)的通用工具。
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>
<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的端口访问),若没有登录,则会跳转到登陆界面。
若没有登录,输入不存在的页面,不会跳转登录界面,而是直接报错。