栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring之SpringMVC(SSM整合)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring之SpringMVC(SSM整合)

Spring之SpringMVC

目录
      • Spring之SpringMVC
        • 一、拦截器
          • ①、创建web项目引入依赖
          • ②、web.xml文件配置
          • ③、spring.xml文件配置
          • ④、项目的大致结构
        • 二、文件上传
          • 1、创建web项目引入依赖
          • 2、web.xml文件配置
          • 3、spring.xml文件配置
          • 4、项目的大致结构
        • 三、SpringSSM整合
          • 1、依赖的导入
          • 2、web.xml配置
          • 3、resources下的文件配置
          • 4、三层结构内容⭐
        • 四、RestFul URL
        • 五、全局异常统一处理
          • 1、简单异常处理器SimpleMappingExceptionResolver
          • 2、自定义异常
          • 3、实现HandlerExceptionResolver接口⭐


一、拦截器

⭐什么是拦截器:简单说就是对客户页面发送的请求进行拦截,进行一系列的处理。

⭐两种实现方式:

  • 实现接口:org.springframework.web.servlet.HandlerInterceptor
  • 继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter


  • 使用登录小案例练习拦截器
  • 当用户没登陆成功, 则无法访问后台以及其他页面
①、创建web项目引入依赖
    
    
      org.springframework
      spring-context
      5.2.4.RELEASE
    
    
     org.springframework
      spring-web
      5.2.4.RELEASE
    
    
    
      org.springframework
      spring-webmvc
      5.2.4.RELEASE
    
    
    
      javax.servlet
      javax.servlet-api
      3.0.1
      provided
    

    
    
      com.fasterxml.jackson.core
      jackson-core
      2.9.6
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.9.6
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.6
    
  
②、web.xml文件配置

  Archetype Created Web Application
  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      utf-8
    
  
  
    encodingFilter
    /*
  
  
  
    helloMvc
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath*:spring.xml
    
    1
  
  
    helloMvc
    /
  


③、spring.xml文件配置
        
        
        
        
        
        
        
                
                
                
                
        








            

                
                    
                    
                    
                
            


④、项目的大致结构


controller/Login.java登录的简单处理

@Controller
public class Login {
    @RequestMapping("islogin")
    public String isLogin(User user, HttpServletRequest req)  {
        System.out.println("123".equals(user.getName()));
        if("123".equals(user.getName())&&"123".equals(user.getPwd())){

            req.getSession().setAttribute("user",user);
            return "hello";
        }else{
            return "redirect:login.jsp?msg=is false";
        }
    }
}

interceptor/interceptor1.java拦截器

public class Interceptor2 extends HandlerInterceptorAdapter {
    //请求之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //不是登录页面都不允许访问
        if(request.getRequestURI().contains("login")){
            return true;
        }
        //判断是否登录成功,成功则放行
        User user=(User) request.getSession().getAttribute("user");
        System.out.println(request.getSession().getAttribute("user"));
        if(user!=null){
            return true;
        }
        //一律跳转登录
        request.getRequestDispatcher("login.jsp").forward(request,response);
        return false;
      //  return false;
    }
}

bean/User.java

public class User {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }
    public String getName() {
        return name;
    }
    public User() {
    }
    private String pwd;
}

前端页面的编写:webapp/

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    登录


${param.msg}

用户名: 密码:

hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    Title


  
${sessionScope.user}


正确密码

错误密码会被拦截


二、文件上传

代码演示:

1、创建web项目引入依赖
    
     org.springframework
      spring-web
      5.2.4.RELEASE
    
    
    
      org.springframework
      spring-webmvc
      5.2.4.RELEASE
    
    
    
      javax.servlet
      javax.servlet-api
      3.0.1
      provided
    

    
    
      commons-fileupload
      commons-fileupload
      1.3.2
    
    
    
      commons-io
      commons-io
      2.4
    

    
    
      com.fasterxml.jackson.core
      jackson-core
      2.9.6
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.9.6
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.6
    

2、web.xml文件配置

  Archetype Created Web Application
  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      utf-8
    
  
  
    encodingFilter
    /*
  
  
  
    helloMvc
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath*:spring.xml
    
    1
  
  
    helloMvc
    /
  


3、spring.xml文件配置
    

    

    
        
    
    
    
        
        
    

    
    
    
        
        
            104857600
        
        
        
            4096
        
    



4、项目的大致结构


①、UserController.java

@Controller
public class UploadController {
    @RequestMapping("upload")
    public String upload(@RequestParam("myfile") MultipartFile file, HttpServletRequest req) throws IOException {
        //判断是否为空
        if(!file.isEmpty()){
            //获取文件名
           String filename= file.getOriginalFilename();
           //获取后缀
            String last=filename.substring(filename.lastIndexOf("."));
            Long tim=System.currentTimeMillis();
            filename=tim+last;
           //获取当前项目的路径
            String load=req.getServletContext().getRealPath("/");
            //上传目录
            File loadfile=new File(load+"/onload");
            //判断是否存在目录
            if(!loadfile.exists()){
                loadfile.mkdirs();
            }
            File srcfile=new File(loadfile,filename);
            //上传
            file.transferTo(srcfile);
            req.setAttribute("msg","上传成功~");
        }else{
            req.setAttribute("msg","文件不能为空");
        }
        return "msg";
    }
}


②视图文件内容

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    Title


  
文件

跳转信息页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    Title


  ${requestScope.msg}



结果




三、SpringSSM整合
  • SSM:Spring+SpringMVC+Mybatis
  • 轻量级框架,重量级配置
1、依赖的导入

pom.xml

  
      junit
      junit
      4.12
      test
    

    
    
      org.springframework
      spring-context
      5.2.4.RELEASE
    

    
    
      org.springframework
      spring-test
      5.2.4.RELEASE
    

    
    
      org.springframework
      spring-jdbc
      5.2.4.RELEASE
    

    
    
      org.springframework
      spring-tx
      5.2.4.RELEASE
    

    
    
      org.aspectj
      aspectjweaver
      1.9.5
    


    
    
      com.mchange
      c3p0
      0.9.5.2
    

    
    
      org.mybatis
      mybatis
      3.5.3
    

    
    
      org.mybatis
      mybatis-spring
      2.0.3
    

    
    
      mysql
      mysql-connector-java
      8.0.19
    

    
    
      org.slf4j
      slf4j-log4j12
      1.7.2
    
    
      org.slf4j
      slf4j-api
      1.7.2
    

    
    
      com.github.pagehelper
      pagehelper
      5.1.10
    

    
    
      org.springframework
      spring-web
      5.2.4.RELEASE
    

    
    
      org.springframework
      spring-webmvc
      5.2.4.RELEASE
    

    
    
      javax.servlet
      javax.servlet-api
      3.0.1
      provided
    

    
    
      com.fasterxml.jackson.core
      jackson-core
      2.10.0
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.10.0
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.10.0
    

    
    
      commons-fileupload
      commons-fileupload
      1.3.2
    

2、web.xml配置


  
  
    contextConfigLocation
    classpath:spring.xml
  
  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
  
  
    encodingFilter
    /*
  

  
  
    org.springframework.web.context.ContextLoaderListener
  
  
  
    springMvc
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath:spring-servlet.xml
    
    
    1
  
  
    springMvc
    /
  
  


3、resources下的文件配置

spring.xml





    
    
        
        
    

    
    

    
    

    
    
        
        
        
        
    

    
    
        
    

    
    
        
        
    
    
    
        
            
            
            
            
        
    

    
    
        
        
    
    
    
        
        
        
    
    
    
        
        
        
    


spring-servlet.xml






    
    

    
    
        
            
            
            
            
        
    


    
    


    
    
        
        
        
        
    

    
    
        
        
            104857600
        
        
        
            4096
        
    



mybatis.xml:




    
        
    
    
        
    
    
        
    


jdbc.properties:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/user_msg?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=root
jdbc.password=java51

log4j.properties

log4j.rootLogger=DEBUG, Console
# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStat

4、三层结构内容⭐
  • Mapper(dao)层

UserMapper.java接口

public interface UserMapper {
    //查询一个
    public User selectOne(Integer useId);
    //插入
    int insert(User user);
    //修改
    int updata(User user);
    //删除
    int delete(Integer userId);
}


  • Service层

UserService.java接口:

public interface UserService {
    //查询
    User selectOne(Integer userId);
    //插入
    int insert(User user);
    //修改
    int updata(User user);

    //删除
    int delete(int userId);
}


UserServiceImp.java

@Service
public class UserServiceImpl implements  UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public User selectOne(Integer userId){
       return userMapper.selectOne(userId);
    }

    @Override
    public int insert(User user) {
        return userMapper.insert(user);
    }

    @Override
    public int updata(User user) {
        return userMapper.updata(user);
    }

    @Override
    public int delete(int userId) {
        return userMapper.delete(userId);
    }
}


  • controller层
    UserController.java:
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("select")
    @ResponseBody
    public User select(Integer userId){
       return userService.selectOne(userId);
    }

    @RequestMapping("insert")
    @ResponseBody
    public int insert(User user){
        return userService.insert(user);
    }

    @RequestMapping("updata")
    @ResponseBody
    public String updata(User user){
        int num=userService.updata(user);
        if(num>0){
            return "updata is true";
        }
            return "updata is false";
    }

//    删除
    @RequestMapping("delete")
    @ResponseBody
    public String delete(User user) {
        int num = userService.updata(user);
        if (num > 0) {
            return "delete is true";
        }
        return "delete is false";
    }
}

  • Bean层

User.java:

public class User {
    private Integer userId;
    private String userName;

    public User() {
    }

    public User(Integer userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + ''' +
                '}';
    }
}

  • mappers映射文件(resource/mappers)

UserMapper.xml:





    
        insert into user values (#{userId},#{userName})
    

    
        update user set userName=#{userName} where userId=#{userId}
    

    
        delete from user where userId=#{userId}
    
    
    


启动tomcat测试结果:
查询:

插入:

修改


删除


四、RestFul URL

概念:
    Restful 风格的 API 是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在Restful 风格中,用户请求的 url 使用同一个 url,用请求方式:get,post,delete,put…等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。


在 Restful 风格中,现有规定如下:

  • GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。
  • POST(CREATE):在服务器端新建一个资源,调用 insert 操作。
  • PUT(UPDATE):在服务器端更新资源,调用 update 操作。
  • PATCH(UPDATE):在服务器端更新资源(客户端提供改变的属性)。(目前jdk7 未实现,tomcat7 不支持)。
  • DELETE(DELETE):从服务器端删除资源,调用 delete 语句。

在原有SSM基础上添加:Controller层/RestUserController.java

public class RestUserController {
    @Autowired
    private UserService userService;

    @GetMapping("ones/{userId}")
    //user-->json
    public User select(@PathVariable Integer userId){
        User user= userService.selectOne(userId);
        return user;
    }

    @PostMapping("insert/{user}")
    public int insert(User user){
        int num=userService.insert(user);
        return num;
    }
}

此处使用了Postman软件————》方便查询


五、全局异常统一处理

     概念:SpringMVC 对于异常处理这块提供了支持,通过 SpringMVC 提供的全局异常处理机制,能够将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。


⭐全局异常实现方式 Spring MVC 处理异常有 3 种方式:

  1. 使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver
  2. 实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器
  3. 使用 @ExceptionHandler 注解实现异常处理

1、简单异常处理器SimpleMappingExceptionResolver
  • 在上面代码的原基础上增加配置
    spring-servilet.xml:
 
     
        
        
        
        
    

创建错误响应页面:error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    Title


  ${ex}--->异常处理......



修改UserController.java

    @RequestMapping("select")
    @ResponseBody
    public User select(Integer userId){
        userId=userId/0;//让其报异常
       return userService.selectOne(userId);
    }


2、自定义异常
  • 增加包exceptions/ParamException.java
public class ParamException extends RuntimeException {

    private String msg;
    private int code;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public ParamException() {
        super("参数异常");
    }
    public ParamException(String msg){
        super("参数异常");
        this.msg=msg;
    }
    public ParamException(int code){
        super("参数异常");
        this.code=code;
    }
    public ParamException(String msg,int code){
        super("参数异常");
        this.code=code;
        this.msg=msg;
    }

}


修改controller/UserController.java

  @RequestMapping("select")
    @ResponseBody
    public User select(Integer userId){
       if(userId == 0){
          throw  new ParamException("参数异常");
       }
       return userService.selectOne(userId);
    }

结果:

自定义映射可以映射专门的处理页面

        
            
                
              key="com.yjxxt.ssm.exceptions.ParamException">param_error
            
        

3、实现HandlerExceptionResolver接口⭐
  • 直接编写一个实现类GlobleException,省去了在spring-servlet.xml文件种配置
@Component
public class GlobleException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) {
        //实例化对象
        //默认的错误页面
        ModelAndView mav=new ModelAndView("error");
        mav.addObject("ex",ex);
        //判断
        if(ex instanceof ParamException){
            ParamException e=(ParamException) ex;
            mav.addObject("code",e.getCode());
            mav.addObject("msg",e.getMsg());
            //指定试图名称
            mav.setViewName("param_error");
        }
        return mav;
    }
}


创建异常接受页面param_error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>


    Title


${msg}---->erro异常



使用实现 HandlerExceptionResolver 接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。


第三种方法略,平时推荐使用第二种方法~~~完!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号