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

SpringMVC框架

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

SpringMVC框架

目录
  • 1:SpringMVC框架的认识
    • 1.1:中央调度器(DispatcherServlet)
    • 1.2:配置识图解析器
    • 1.3:转发forward/重定向redirect
  • 2:SpringMVC注解式
    • 2.1:@RequestMapping第二种用法
    • 2.2:请求方式Method属性
      • 2.2.1:Request接收参数
      • 2.2.2:接收用户提交的参数
      • 2.2.3:配置过滤器设置页面编码
      • 2.2.4:@RequestParam注解
    • 2.3:处理请求方法的返回值
      • 2.3.1:用处理器的返回值实现ajax的数据接收
    • 2.4:url-pattern(静态资源问题)
    • 2.5:动态获取项目地址
  • 3:SSM三大框架整合开发(Spring SpringMVC Mybatis)
    • 3.1:创建项目结构
    • 3.2:加入spring,mybatis,springmvc依赖
    • 3.3:创建主配置文件applicationContext,spring,springmvc,mybatis,jdbc,web.xml等配置文件
    • 3.4:创建dao,entity,controller,service层的对象
    • 3.5:创建页面并测试
  • 4:集中统一处理异常
    • 4.1:创建自定义的异常类
    • 4.2:创建普通类作为全局异常处理类
    • 4.3:组件扫描器,注解驱动
  • 5:拦截器
    • 5.1:创建拦截器类
    • 5.2:声明拦截器
    • 5.3拦截器和过滤器的区别
  • 6:springmvc的执行流程(映射器的介绍)

1:SpringMVC框架的认识

1:SpringMVC是spring的一个模块框架,专门做web开发的
2:SpringMVC开发底层是servlet,作用是servlet的功能增强
3:SpringMVC也可以把对象放到容器中管理,@Controller对象

1.1:中央调度器(DispatcherServlet)

中央调度器DispatcherServlet是Servlet对象
作用:
1:负责接收用户请求
2:扫描Controller对象
3:把请求转发给Controller对象,然后Controller对象处理请求
4:把返回结果发送到结果页面

流程图:
用户请求(index.jsp)——中央调度器(DispatcherServlet)——Controller对象

中央调度器代码实现:
1:创建web项目

2:pom.xml加入依赖

    
      javax.servlet
      javax.servlet-api
      4.0.1
      provided
    

    
      org.springframework
      spring-webmvc
      5.3.12
    

3:配置web.xml(声明中央调度器对象)




    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet

        
        
            contextConfigLocation
            classpath:springmvc.xml
        
        
        
        1
    
    
        
    
        springmvc
        
        *.do
    

4:在resources文件夹下创建springmvc配置文件




	
    

5:创建控制器类
配置tomcat:

配置index.jsp页面:

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


    Title



发起some.do请求

创建控制器类(用来处理请求):

package com.javaWeb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;


 
@Controller
public class MyController {

    
     
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        
        ModelAndView mv = new ModelAndView();
        //将结果添加到返回值中,底层是setAttribute
        //addObject(key,数据);
        mv.addObject("msg","执行doSome方法");
        //设置识图(结果页面)
        mv.setViewName("/result.jsp");
        return mv;//返回之后才会做setAttribute方法或forward方法等
    }
}

创建识图页面(结果页面):

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


    Title


msg数据:${msg}

测试:

1.2:配置识图解析器

为了防止用户跳过index.jsp直接访问some.do请求的result.jsp需要将结果页面result.jsp切换文件夹
将结果页面result.jsp放入WEB-INF文件夹下,资源保护防止直接访问result.jsp

在springmvc的配置文件中声明视图解析器:




    

    
    
        
        
        
        
    


修改控制器的处理结果页面:

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        //在把文件资源保护后原路径:/WEB-INF/view/result.jsp
        //在添加资源解析器后可以直接写成result
        mv.setViewName("result");
        return mv;
    }
}
1.3:转发forward/重定向redirect

使用ModelAndView的转发forward和重定向redirect来跳转页面
作用:
当文件资源不在识图解析器配置的路径内,可以使用转发和重定向到达页面(必须写完整路径)
重定向redirect:无法访问WEB-INF下的资源
转发forward:可以访问WEB-INF的资源

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("forward:/result.jsp");
        return mv;
    }
}
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("redirect:/result.jsp");
        return mv;
    }

使用redirect的时候发送一条请求实际处理两条请求,所以是两个request所以结果页面接收参数需要使用EL表达式:${param.参数名} 来接收参数

2:SpringMVC注解式 2.1:@RequestMapping第二种用法

@RequestMapping不但可以放在方法上面,还可以放在类上面:

@Controller
//放在类上面相当于处理请求的地址变成/user/some.do
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.setViewName("result");
        return mv;
    }
}

发起请求的主页面(发送请求使用user/some.do):



    Title


发起some.do请求

2.2:请求方式Method属性

@RequestMapping还有Method属性,是用来指定使用get请求处理还是post处理

@Controller
@RequestMapping(value = "/user")
public class MyController {
    
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.setViewName("result");
        return mv;
    }
}
2.2.1:Request接收参数

Controller控制器接收参数的方式:
HttpServletRequest
HttpServletResponse
HttpSession

需要在处理请求的方法参数上加上这三个参数:

@Controller
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    //加入接收请求参数的参数:HttpServletRequest request, HttpServletResponse response, HttpSession session
    //接收参数的方法和Servlet一样:request.getParameter("参数");
    public ModelAndView doSome(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        String name = request.getParameter("name");
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.addObject("name",name);
        mv.setViewName("result");
        return mv;
    }
}
2.2.2:接收用户提交的参数

逐个接收:

请求页面(传入的参数名name):



    Title


姓名

处理页面:

@Controller
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    
    public ModelAndView doSome(String name){//加入参数

        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.addObject("name",name);
        mv.setViewName("result");
        return mv;
    }
}

显示结果:


对象接收:

@Controller
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    
    public ModelAndView doSome(Student student){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.addObject("name",student.getName());//使用对象的get方法获取数据
        mv.setViewName("result");
        return mv;
    }
}
2.2.3:配置过滤器设置页面编码

在web.xml文件中声明过滤器

    
    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
        
            encoding
            utf-8
        
        
        
            forceRequestEncoding
            true
        
        
        
            forceResponseEncoding
            true
        
    

    
    
        characterEncodingFilter
        
        
    public ModelAndView doSome(@RequestParam(value = "Rname",required = false) String name){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","执行doSome方法");
        mv.addObject("name",name);
        mv.setViewName("result");
        return mv;
    }
}
2.3:处理请求方法的返回值

返回值ModelAndView
返回值是ModelAndView是同时处理数据(接收参数)和视图(页面跳转)的

返回值String
如果返回值只是一个跳转页面操作只需要用字符串就可以

@Controller
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public String doSome(){
        //内部会执行forward方法
        return "result";
    }
}

返回值void
返回值void表示不做数据处理也不做视图页面跳转
主要作用是在ajax从控制器打印数据时,接收print而已

@Controller
@RequestMapping(value = "/user")
public class MyController {
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public void doSome(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        PrintWriter pw = response.getWriter();
        //假设数据处理完成后返回ajax的json格式的数据,这样要用到void返回值,不需要做任何处理
        pw.println("ajax的json数据格式");
        pw.flush();
        pw.close();
    }
}

返回值Object
返回值Object表示返回只是数据,和视图无关
数据可以是Integer,String等基础数据类型还有合法类型等

2.3.1:用处理器的返回值实现ajax的数据接收

步骤:
1:加入依赖:加入处理json工具库的依赖,springmvc默认使用的是jackson杰克逊工具


2:在springmvc的配置文件加入注解驱动
底层原理:
注解驱动的作用是完成java对象转换成jason,xml,text,二进制等数据格式的转换
它有一个HttpMessageConverter接口,这个接口的实现类就是用来做数据格式转换的


3:在处理器方法上加入@ResponseBody注解

实现过程:
1:加入依赖:

	
      com.fasterxml.jackson.core
      jackson-core
      2.12.3
    

    
      com.fasterxml.jackson.core
      jackson-databind
      2.12.3
    

2:创建ajax页面(index.jsp):

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


    Title
    
    


姓名

5:在springmvc配置页面注册驱动:


4:配置处理器页面:

@Controller
public class MyController {

    @RequestMapping(value = "/some.do")
    @ResponseBody//这个注解的作用是要把控制器处理完的对象转为json对象通过响应体HttpServletResponse输出给浏览器
    public Student doSome(String name) throws IOException {
        Student student = new Student(name);
        return student;
    }
}

结果:

2.4:url-pattern(静态资源问题)

项目中的index.jsp(默认主页面)还有静态资源:jpg或html等都归tomcat处理(跟框架无关)
项目中的控制器处理的请求,比如*.do,*.xml,*.action等都是归springmvc框架处理的

在tomcat服务器中的web.xml配置文件中有一项配置:

    
        default
        org.apache.catalina.servlets.DefaultServlet
        
            debug
            0
        
        
            listings
            false
        
        1
    

    
        default
        /
    

名为default的servlet
它是处理静态资源的配置,还可以处理未映射的请求(没有在web.xml映射Mapping的servlet是未映射)

如果想用springmvc处理静态资源的话需要将tomcat的default覆盖:
在自己项目的web.xml中修改springmvc的Mapping:

    
        springmvc
        org.springframework.web.servlet.DispatcherServlet

        
            contextConfigLocation
            classpath:springmvc.xml
        

        1
    

    
        springmvc
        
        /
    

第一种方式处理静态资源:然后在springmvc的配置文件加入标签:default-servlet-handle




第二种方式处理静态资源:在springmvc的配置文件加入标签resources:

    
    
2.5:动态获取项目地址

只针对一个页面文件有效标签:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme() + "://" +
        request.getServerName() + ":" + request.getServerPort() +
        request.getContextPath() + "/";
%>


    Title
    





标签作用:让页面的所有href可以省去地址路径,只需要写资源名或请求就可以

3:SSM三大框架整合开发(Spring SpringMVC Mybatis)

SSM三大框架整合:spring集成Mybatis再配置springmvc
步骤:

3.1:创建项目结构

3.2:加入spring,mybatis,springmvc依赖
	
      junit
      junit
      4.11
      test
    

    
      org.springframework
      spring-tx
      5.3.12
    

    
      org.springframework
      spring-jdbc
      5.3.13
    

    
      org.mybatis
      mybatis
      3.5.7
    

    
      org.mybatis
      mybatis-spring
      2.0.6
    

    
      mysql
      mysql-connector-java
      8.0.27
    

    
      org.springframework
      spring-aspects
      5.3.13
    

    
      org.springframework
      spring-context
      5.3.12
    

    
      com.alibaba
      druid
      1.1.12
    

    
      javax.servlet
      javax.servlet-api
      4.0.1
      provided
    

    
      javax.servlet.jsp
      jsp-api
      2.2
      provided
    

    
      org.springframework
      spring-webmvc
      5.3.12
    

加入读取配置文件的插件:

    
      
      
        src/main/java
        
          ***.xml
        
        false
      

      
        src/main/resources
        
          ***.xml
        
        false
      
      
    
3.3:创建主配置文件applicationContext,spring,springmvc,mybatis,jdbc,web.xml等配置文件

mybatis配置文件:





    
        
    


jdbc配置文件:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ccxg
name=root
password=123456

spring配置文件:




    
    
        
        
        
        
    
    
    
        
        
    
    
    
        
        
    
    
	

springmvc配置文件:




    
    
        
        
    
    

主配置文件applicationContext:




    
    

web.xml配置文件:



    
        dispatcherservlet
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:conf/applicationContext.xml
        
        1
    
    
        dispatcherservlet
        *.do
    


    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
        
            forceRequestEncoding
            true
        
        
            forceResponseEncoding
            true
        
    

    
        characterEncodingFilter
        
public class UserException extends Exception{
    public UserException() {
        super();
    }

    public UserException(String message) {
        super(message);
    }
}
package com.javaWeb.exception;


public class UserMessageException extends UserException{
    public UserMessageException() {
        super();
    }

    public UserMessageException(String message) {
        super(message);
    }
}

在controller层抛出异常:

    @RequestMapping(value = "/some.do")
    public ModelAndView doSome() throws UserException {//抛出异常建议要在声明处抛出异常的父类
        ModelAndView mv = new ModelAndView();
        throw new UserMessageException("信息异常已抛出");
    }
4.2:创建普通类作为全局异常处理类

package com.javaWeb.handler;

import com.javaWeb.exception.UserMessageException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;


@ControllerAdvice
public class UserExceptionHandler {

    
    @ExceptionHandler(value = UserMessageException.class)
    public ModelAndView UserMessageException(Exception ex){
        
        ModelAndView mv = new ModelAndView();
        mv.setViewName("result");
        return mv;
    }
    
    
    @ExceptionHandler
    public ModelAndView OtherException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("result");
        return mv;
    }
}
4.3:组件扫描器,注解驱动



5:拦截器

拦截器作用是判断用户请求的权限,合法性等

5.1:创建拦截器类

package com.javaWeb.handler;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Interceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        modelAndView.setViewName("result");
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
5.2:声明拦截器
    
    
        
        
            
            
        
		
        
            
            
        
    

拦截器的声明底层是用AarrayList集合存储的

5.3拦截器和过滤器的区别

1:过滤器是servlet中的对象,拦截器是框架中的对象
2:过滤器实现Filter接口的对象,拦截器是HandlerInterceptor
3:过滤器是用来设置request,response的参数属性的,侧重数据过滤
拦截器用来验证请求合法性,能截断请求
4:过滤器是在拦截器之前执行的
5:过滤器是tomcat服务器创建的对象,拦截器是springmvc容器中的对象
6:过滤器是一个执行时间点,拦截器是三个执行时间点
7:过滤器可以处理jsp,js,html等,拦截器是对Controller对象进行拦截,如果请求不会被中央调度器接收,那么拦截器也收不到
8:拦截器拦截普通类方法执行(Controller控制器的方法),过滤器过滤servlet请求响应

6:springmvc的执行流程(映射器的介绍)


springmvc处理流程:

1:用户发起请求:some.do


2:DispatcherServlet中央调度器接收请求some.do,把请求转交给处理器映射器
处理器映射器作用:springmvc框架中的一个对象,框架把实现了HandlerMapping接口的类叫做映射器(有很多个),框架把处理器对象放到一个叫做处理器执行链(HandlerExecutionChain)的类里保存
HandlerExecutionChain的类里保存着:处理器对象(Controller对象),拦截器(List


3:中央调度器(DispatcherServlet)把处理器映射器的HandlerExecutionChain中的处理器对象交给了处理器适配器对象(有很多个)
处理器适配器:springmvc框架的对象,实现了HandlerAdapter接口的对象
适配器作用:执行处理器方法(执行Controller对象的方法得到返回值ModelAndView)


4:中央调度器(DispatcherServlet)把处理器适配器中获取的返回值ModelAndView交给视图解析器对象
视图解析器:实现了ViewResoler接口的对象(有多个)
视图解析器作用:使用前缀后缀组成视图完整路径,然后创建view对象
View是一个接口表示视图的,在框架中的jsp,html不是String表示,而是使用View和他的实现类表示视图
比如:mv.setViewName(“result”);执行完后这个result会变成路径:/WEB-INF/jsp/result.jsp
会被转成View对象:相当于mc.setView(new ForwardView("/WEB-INF/jsp/result.jsp"));转发
InternalResourceView:视图类,表示jsp文件,视图解析器会创建InternalResourceView对象
这对象里有个属性叫url=/WEB-INF/jsp/result.jsp


5:中央调度器(DispatcherServlet)把视图解析器中创建的View对象获取到,调用View类的方法
把返回值Model数据放入request作用域中,执行对象视图的forward,请求结束。

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

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

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