Springmvc02
拦截器,文件上传,ssm环境搭建
八、 请求转发与重定向的问题
Springmvc 默认采用服务器内部转发的形式展示页面信息。同样也支持重定向
页面。
1.重定向到 jsp 页面
2.请求转发到试图,转发到controller
1)controller层PageController
/**
* 请求转发与重定向
*/
@Controller
public class PageController {
//page01重定向到v1.jsp
@RequestMapping("page01")
public String page01(){
return "redirect:v1.jsp";
}
//通过重定向传值 前台通过{param.a}取值
@RequestMapping("page02")
public String page02(){
return "redirect:v1.jsp?a=1&b=上海";
}
//通过重定向传值,解决传中文乱码情况,用此方法
@RequestMapping("page04")
public String page04(RedirectAttributes attr){
attr.addAttribute("a",1);
attr.addAttribute("b","上海");
return "redirect:v1.jsp";
}
//也可以通过重定向到某一个controller方法 访问page05重定向到page06方法
@RequestMapping("page05")
public String page05(){
System.out.println("page05");
return "redirect:page06";
}
@RequestMapping("page06")
public String page06(){
System.out.println("page06");
return "hello";
}
//请求转发到另外一个controller方法
@RequestMapping("page07")
public String page07(){
System.out.println("page07");
return "forward:page08";
}
@RequestMapping("page08")
public String page08(){
System.out.println("page08");
return "hello";
}
}
2)重定向页面v1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
测试重定向
v1.jsp
a: ${param.a}
b: ${param.b}
九、 获取 request,response 对象
对于我们的方法默认方法的参数是空的,这时候要想获取 request,response
对象如何获取?
public ModelAndView queryUser(HttpServletRequest request,HttpServletResponse
response){
String userName= request.getParameter("userName");
ModelAndView mv=new ModelAndView();
mv.addObject("userName", userName);
mv.setViewName("request");
return mv;
}
十、 理解 ModelAndView 模型视图类
见名知意,从名字上我们可以知道 ModelAndView 中的 Model 代表模型,View
代表视图。即,这个类把要显示的数据存储到了 Model
属性中,要跳转的视图信息存
储到了 view 属性。我们看一下 ModelAndView 的部分源码,即可知其中关系
十一、 SpringMvc 之 Json 数据开发
@ResponseBody
该注解用于将 Controller 的方法返回的对象,通过适当的
HttpMessageConverter
转换为指定格式后,写入到 Response 对象的 body 数据区。
返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml
等)
使用(通常用于 ajax 请求)
@RequestBody
该注解用于读取 Request 请求的 body 部分数据,使用系统默认配置的
HttpMessageConverter 进行解析,然后把相应的数据绑定到要返回的对象上
,再把
HttpMessageConverter 返回的对象数据绑定到 controller 中方法的参数上
Json 数据使用好处
Json
在企业开发中已经作为通用的接口参数类型,在页面(客户端)解析很方便。
SpringMvc 对于 json 提供了良好的支持,这里需要修改相关配置,添加 json
数据支持
功能
1.添加 json 依赖 jar 包.pom.xml中添加依赖
com.fasterxml.jackson.core
jackson-core
2.7.0
com.fasterxml.jackson.core
jackson-databind
2.7.0
com.fasterxml.jackson.core
jackson-annotations
2.7.0
2.修改 servlet-context.xml
添加 json 转换器配置
3.Json 数据绑定的支持 controller层添加绑定方法
//把user传给前台json格式
@ResponseBody
@RequestMapping("hello09")
public User hello09(User user) {
System.out.println(user);
return user;
}
4`.Jsp 页面取值,返回json对象
十二、 拦截器
SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的主要作
用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断
用户是否登陆等操作。
对于 springmvc 拦截器的定义方式有两种方式
1. 实现接口: org.springframework.web.servlet.HandlerInterceptor
*2. 继承适配器*
***org.springframework.web.servlet.handler.HandlerInterceptorAdapter
3.实现 HandlerInterceptor 接口方式定义我们的拦截器代码如下:
3.1--controller层加UserController,模拟用户登录实现拦截
/**
* 测试拦截器 User
*/
@Controller
@RequestMapping("user")
public class UserController {
/*
放开login的拦截
将登陆信息存到session中
*/
@RequestMapping("login")
public String login(User user, HttpSession session){
session.setAttribute("user", user);
System.out.println("登陆成功");
return "index";
}
//模拟用户登陆,无登录实现拦截
@RequestMapping("queryUser")
@ResponseBody
public User login(Integer id){
User user = new User();
user.setId(id);
user.setName("zhangsan");
user.setAge(19);
return user;
}
}
3.2对应配置有两种方式:servlet-context.xml配置
配置方式一(拦截所有请求配置方式):
配置方式二(拦截指定请求配置方式)
3.3配置拦截器
新建packageMyHandlerInterceptor
/**
* 测试拦截器
*/
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("before target method...");
/***
* 判断session是否为空,简单模拟用户是否登录
* */
User user = (User) httpServletRequest.getSession().getAttribute("user");
if(null==user){
System.err.println("没有登陆");
return false;
}
return true;// 返回false 整个请求停止; true代表继续执行
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("after target method...");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("after view method...");
}
}
4.继承 HandlerInterceptorAdapter 方式定义拦截器
(实际上最终还是HandlerInterceptor 接口实现)
4.1 创建拦截器
Inteceptor中创建MyHandlerInterceptor2
/**
* 继承 HandlerInterceptorAdapter 方式定义拦截器(
*/
public class MyHandlerInterceptor2 extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 222");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 222");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 222");
}
}
4.2 servlet-context.xml中添加拦截配置(同上)
4.3UserController类中加登录方法(同上)
十三、 SpringMvc 文件上传
1.Pom 文件修改 添加 commons-fileupload 依赖
commons-fileupload
commons-fileupload
1.3.2
2.servlet-context.xml中配置
104857600
4096
3.controller中加上传方法 FileController.java
/**
*文件上传类
*/
@Controller
public class FileController {
@RequestMapping("uploadFile")
@ResponseBody
public String uploadFile(HttpServletRequest request){
// 1. 强制转换
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
// 2. 获取上传文件
MultipartFile file = mr.getFile("file");
// 3. 非空判断
if(null!=file && !file.isEmpty()){
// 获取上传文件夹的路径
String path=request.getSession().getServletContext().getRealPath("upload");
// 获取原始名字
String filename = file.getOriginalFilename();
// 4. 存储
try {
file.transferTo(new File(path, filename));
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}
}
4.前台表单选择上传文件file.jsp页面 ,上传到服务器存储路径为upload
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
5,测试页面上传
十四、 SSM 框架集成环境搭建
对于 spring 与 mybatis
的环境集成,我们已经集成过了,只需要把原来集成的代码
生成器的项目(spring_mybatis_自动化代码生成)拿过来修改相关的配置就可以了,
具体步骤如下:
1. jar 包依赖添加(原有基础上继续添加 springmvc 相关依赖 jar
包及对应
jetty 插件) 修改 pom.xml 文件
4.0.0
com.shsxt
ssm
1.0-SNAPSHOT
war
ssm Maven Webapp
UTF-8
1.8
1.8
junit
junit
4.12
test
org.springframework
spring-context
4.3.2.RELEASE
org.springframework
spring-test
4.3.2.RELEASE
org.springframework
spring-jdbc
4.3.2.RELEASE
org.springframework
spring-tx
4.3.2.RELEASE
org.aspectj
aspectjweaver
1.8.9
c3p0
c3p0
0.9.1.2
org.mybatis
mybatis
3.4.1
org.mybatis
mybatis-spring
1.3.0
mysql
mysql-connector-java
5.1.39
org.slf4j
slf4j-log4j12
1.7.2
org.slf4j
slf4j-api
1.7.2
com.github.pagehelper
pagehelper
4.1.0
org.springframework
spring-web
4.3.2.RELEASE
org.springframework
spring-webmvc
4.3.2.RELEASE
javax.servlet
javax.servlet-api
3.0.1
com.fasterxml.jackson.core
jackson-core
2.7.0
com.fasterxml.jackson.core
jackson-databind
2.7.0
com.fasterxml.jackson.core
jackson-annotations
2.7.0
commons-fileupload
commons-fileupload
1.3.2
ssm
src/main/resources
src/main/java
**/*.xml
**/*.properties
**/*.tld
false
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
src/main/resources/generatorConfig.xml
true
true
org.mybatis.generator
mybatis-generator-core
1.3.2
org.mortbay.jetty
maven-jetty-plugin
6.1.21
10
/ssm
2.web.xml 文件配置
contextConfigLocation
classpath:spring.xml
org.springframework.web.context.ContextLoaderListener
char encoding filter
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
springMvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:servlet-context.xml
1
springMvc
/
3. Springmvc 配置文件 servlet-context.xml 添加
104857600
4096
4.Spring.xml 配置
5.数据库配置db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
6.日志打印导入
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
7.mybatis集成配置,包扫描及别名
8. generatorConfig.xml更改生成路径及仓库路径
9.mybatis-generator自动生成UserMapper.xml,及po中User类等
生成目录如下
10.更改UserMapper.xml,增删改查名称修改,加入分页配置等
id, user_name, user_pwd, real_name, nation, card_id
delete from user
where id = #{id,jdbcType=INTEGER}
insert into user
id,
user_name,
user_pwd,
real_name,
nation,
card_id,
#{id,jdbcType=INTEGER},
#{userName,jdbcType=VARCHAR},
#{userPwd,jdbcType=VARCHAR},
#{realName,jdbcType=VARCHAR},
#{nation,jdbcType=VARCHAR},
#{cardId,jdbcType=INTEGER},
update user
user_name = #{userName,jdbcType=VARCHAR},
user_pwd = #{userPwd,jdbcType=VARCHAR},
real_name = #{realName,jdbcType=VARCHAR},
nation = #{nation,jdbcType=VARCHAR},
card_id = #{cardId,jdbcType=INTEGER},
where id = #{id,jdbcType=INTEGER}
11.导入Base包工具包
1)AssertUtil.java
package com.shsxt.base;
public class AssertUtil {
/**
* 表达式结果真时判断
* @param expression
* @param msg
*/
public static void isTrue(Boolean expression,String msg){
if(expression){
throw new ParamException(msg);
}
}
public static void isTure(Boolean expression){
if(expression){
throw new ParamException("参数异常");
}
}
/**
* 参数为空时
* @param object
* @param msg
*/
public static void isNull(Object object,String msg){
if(object==null){
throw new ParamException(msg);
}
}
/**
* 参数不空时
* @param object
* @param msg
*/
public static void notNull(Object object,String msg){
if(object!=null){
throw new ParamException(msg);
}
}
}
2)BaseMapper.java
package com.shsxt.base;
import org.springframework.dao.DataAccessException;
import java.util.List;
import java.util.Map;
public interface BaseMapper {
/**
* 添加记录不返回主键
* @param entity
* @return
* @throws DataAccessException
*/
public int insert(T entity) throws DataAccessException;
/**
*
* @param entities
* @return
* @throws DataAccessException
*/
public int insertBatch(List entities) throws DataAccessException;
/**
* 查询总记录数
* @param map
* @return
*/
@SuppressWarnings("rawtypes")
public int queryCountByParams(Map map) throws DataAccessException;
/**
* 查询记录 通过id
* @param id
* @return
*/
public T queryById(Integer id) throws DataAccessException;
/**
* 分页查询记录
* @param baseQuery
* @return
*/
public List queryForPage(BaseQuery baseQuery) throws DataAccessException;
/**
* 查询记录不带分页情况
* @param map
* @return
*/
@SuppressWarnings("rawtypes")
public List queryByParams(Map map) throws DataAccessException;
/**
* 更新记录
* @param entity
* @return
*/
public int update(T entity) throws DataAccessException;
/**
* 批量更新
* @param map
* @return
* @throws DataAccessException
*/
public int updateBatch(Map map) throws DataAccessException;
/**
* 删除记录
* @param id
* @return
*/
public int delete(Integer id) throws DataAccessException;
/**
* 批量删除
* @param ids
* @return
*/
public int deleteBatch(int[] ids) throws DataAccessException;
}
3)BaseQuery.java分页查询
package com.shsxt.base;
public class BaseQuery {
/**
* 分页页码
*/
private int pageNum=1;
/**
* 每页记录数
*/
private int pageSize=10;
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
4)BaseService.java
package com.shsxt.base;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Map;
public abstract class BaseService {
@Autowired
public BaseMapper baseMapper;
/**
* 添加记录
* @param entity
* @return
* @throws Exception
*/
public int insert(T entity) throws Exception{
int result= baseMapper.insert(entity);
return result;
}
/**
* 批量添加记录
* @param entities
* @return
* @throws Exception
*/
public int insertBatch(List entities) throws Exception{
return baseMapper.insertBatch(entities);
}
/**
* 根据参数统计记录数
* @param map
* @return
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public int queryCountByParams(Map map)throws Exception{
return baseMapper.queryCountByParams(map);
}
/**
* 查询记录通过id
* @param id
* @return
* @throws Exception
*/
public T queryById(Integer id)throws Exception{
AssertUtil.isNull(id, "记录id非空!");
return baseMapper.queryById(id);
}
/**
* 分页查询
* @param baseQuery
* @return
* @throws Exception
*/
public PageInfo queryForPage(BaseQuery baseQuery)throws Exception{
PageHelper.startPage(baseQuery.getPageNum(),baseQuery.getPageSize());
List list= baseMapper.queryForPage(baseQuery);
PageInfo pageInfo=new PageInfo(list);
return pageInfo;
}
/**
*
* @param map
* @return
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public List queryByParams(Map map)throws Exception{
return baseMapper.queryByParams(map);
}
/**
* 查询记录
* @param entity
* @return
* @throws Exception
*/
public int update(T entity)throws Exception{
return baseMapper.update(entity);
}
/**
* 批量更新
* @param map
* @return
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public int updateBatch(Map map) throws Exception{
return baseMapper.updateBatch(map);
}
/**
* 删除记录
* @param id
* @return
* @throws Exception
*/
public int delete(Integer id) throws Exception{
// 判断 空
AssertUtil.isNull(id, "记录id非空!");
AssertUtil.isNull(queryById(id), "待删除的记录不存在!");
return baseMapper.delete(id);
}
/**
* 批量删除
* @param ids
* @return
*/
public int deleteBatch(int[] ids) throws Exception{
AssertUtil.isNull(ids.length==0,"请至少选择一项记录!");
return baseMapper.deleteBatch(ids);
}
}
5)ParamException.java
package com.shsxt.base;
/**
* 参数异常类
* @author Administrator
*
*/
public class ParamException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = -5962296753554846774L;
/**
* 错误状态码
*/
private int errorCode;
public ParamException() {
}
/**
* 错误消息
* @param msg
*/
public ParamException(String msg) {
super(msg);
}
public ParamException(int errorCode,String msg){
super(msg);
this.errorCode=errorCode;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
}
12.UserMapper.java继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper {
13.service包中新建UserService继承BserService
/**
*环境搭建调用userMapper
*/
@Service
public class UserService extends BaseService {
@Autowired
private UserMapper userMapper;
}
14.controller层新建UserController,测试userd的增删,改查及分页功能
/**
* 增删改查及分页功能
*/
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("addUser")
@ResponseBody
public String addUser(User user) throws Exception {
userService.insert(user);
return "添加成功";
}
@RequestMapping("delUser")
@ResponseBody
public String delUser(Integer id) throws Exception {
userService.delete(id);
return "删除成功";
}
@RequestMapping("updateUser")
@ResponseBody
public String updateUser(User user) throws Exception {
userService.update(user);
return "更新成功";
}
@RequestMapping("queryUserList")
@ResponseBody
public PageInfo queryUserList(BaseQuery query) throws Exception {
return userService.queryForPage(query);
}
}
15启动 jetty 服务器
16.视图页面部分代码接收结果显示:
测试添加user功能
测试分页查询功能