ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springMVC

2022-01-15 11:58:40  阅读:163  来源: 互联网

标签:拦截器 请求 springMVC 视图 对象 springmvc servlet


springmvc简介

1.SpringMVC 也叫 Spring web mvc。是 Spring 框架的一部分,是在 Spring3.0 后发布的.

2.SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的。其实就是servlet的一个升级.

3 . web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让你做web开发方便。

4.SpringMVC就是一个Spring。 Spring是容器,ioc能够管理对象,使用, @Component, @Repository, @Service, @Controller

SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), springmvc容器中放的是控制器对象,

5.我们要做的是 使用@Contorller创建控制器对象, 把对象放入到springmvc容器中, 把创建的对象作为控制器使用

这个控制器对象能接收用户的请求, 显示处理结果,就当做是一个servlet使用。

6.使用@Controller注解创建的是一个普通类的对象, 不是Servlet。 springmvc赋予了控制器对象一些额外的功能。

7.web开发底层是servlet, springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)

DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后DispatherServlet把请求转发给我们的Controller对象, 最后是Controller对象处理请求。

SpringMVC 优点:

1.基于 MVC 架构

基于 MVC 架构,功能分工明确。解耦合,

2.容易理解,上手快;使用简单。

可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的特定的接口和类。

3.作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合Strtus,MyBatis,Hiberate,JPA 等其他框架。

4.SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注解。方便灵活。使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource在控制器类中注入 Service, Service 类中注入 Dao。

springmvc执行流程图

(1)浏览器提交请求到中央调度器

(2)中央调度器直接将请求转给处理器映射器。

(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后

返回给中央调度器。

(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。

(5)处理器适配器调用执行处理器。

(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给

处理器适配器。

(7)处理器适配器直接将结果返回给中央调度器。

(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

(9)视图解析器将封装了的视图对象返回给中央调度器

(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。

(11)中央调度器响应浏览器。       

 

 

 第一个springMVC项目

第一个springmvc项目

需求:用户在页面发起一个请求,请求交给springmvc的控制器对象,并显示请求的处理结果

实现步骤

1:新建web,maven工程

2:加入依赖

      spring-webmvc依赖,间接把spring依赖都加入到项目中

      jsp,servlet依赖

<!--servlet依赖-->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

</dependency>

<!--springmvc依赖-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>5.2.6.RELEASE</version>

</dependency>

3:重点:在web.xml文件中注册springmvc框架的核心对象 DispatcherServlet

      1)DispatcherServlet叫做中央调度器,是一个servlet,他的父类是继承HttpServlet

      2)DispatcherServlet也叫前端控制器(fount controller)

      3)DispatcherServlet负责用户接收的请求,调用其他的控制器对象,并把请求的处理结果显示给用户

<!--声明,注册springmvc的核心对象DispatcherServlet

[/WEB-INF/springmvc-servlet.xml]

springmvc创建容器对象时,读取的配置文件默认是/WEB-INF/<servlet-name>-servlet.xml

-->

<servlet>

<servlet-name>myweb</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--自定义springmvc读取的配置文件的位置-->

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:springmvc.xml</param-value>

</init-param>

<!--在tomcat启动后,创建Servlet对象

load-on-startup:表示tomcat启动后创建对象的顺序。他的值是整数(大于0的整数),值越小,tomcat创建对象的时间越早

-->

<load-on-startup>1</load-on-startup>

</servlet>

 

<servlet-mapping>

<servlet-name>myweb</servlet-name>

<!--

使用框架的时候,url-pattern可以使用两种值

1:使用扩展名,语法*.xxxx,xxxx是自定义扩展名,常用的有*.do*.action*.mvc等

2:使用斜杠"/"

-->

<url-pattern>*.do</url-pattern>

</servlet-mapping>

 

4:创建一个发起请求的页面 (index.jsp)

5:创建控制器类

     1)在类的上面加入@Controller注解  创建对象,并放入到springmvc容器中

     2)在类中的方法上面加入@RequestMapping注解。

6:创建一个显示页面,显示处理结果

7:创建springmvc配置文件 (和spring的配置文件一样)

   1)声明主键扫描器,指定@Controller注解所在的包。

   2)声明视图解析器。帮助处理视图的。

<!--声明组件扫描器-->

<context:component-scan base-package="com.ning.controller"/>

<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->

<bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!--前缀:视图文件地路径-->

<property  name="prefix "  value="/WEB-INF/view/"/>

<!--后缀:试图文件的拓展名-->

<property  name="suffix"  value=".jsp"/>

</bean>

 @RequestMapping 的使用方法:  

*@RequestMapping:请求映射,作用是把一个请求地址和一个方法绑定到一起

*一个请求指定一个方法处理

*属性:

*1:value是一个String,表示请求的uri地址的(some.do)

*value的值必须是唯一的,不可重复的,在使用时,推荐地址以“/”开头

*位置:

2:method,表示请求方式

例如;get请求方式:RequestMethod.GET

*post请求方式:RequestMethod.POST

 

*1:在方法的上面,常用

*2:在类的上面

*说明;使用@RequestMapping修饰的方法叫做处理器方法或者控制器方法。

*使用@RequestMapping修饰的方法可以处理请求的,类似于servlet中的doGet()doPost()

*

*

1: 放在类的上面

/**@RequestMapping:

*value:所有请求地址的公共部分,叫做模块名称。

*位置:放在类上面

*

*/

    @RequestMapping(value="/text")

 

2:放在方法的上面

 @RequestMapping(value="/some.do",method=RequestMethod.GET)

 

解决POST请求下中文乱码问题

在web.xml文件中加入

<!--注册·声明过滤器,解决post请求乱码问题-->

<filter>

<filter-name>characterEncodingFilter</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>

<!--强制请求对象(HttpServletRequest)使用encoding编码的值(utf-8)-->

<init-param>

<param-name>forceRequestEncoding</param-name>

<param-value>true</param-value>

</init-param>

<!--强制请求对象(HttpServletResponse)使用encoding编码的值(utf-8)-->

<init-param>

<param-name>forceResponseEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>characterEncodingFilter</filter-name>

<!--

/*:表示强制所有的请求先通过过滤器处理

-->

<url-pattern>/*</url-pattern>

</filter-mapping>

接收请求参数

接受请求参数:接受用户请求参数

接收用户请求的参数,使用的处理器的方法形参

1)HttpServletRequest

2)HttpServletResponse

3)HttpSession

4)用户提交的数据

接收用户提交的参数:

1)逐个接受

2)对象接受

1:逐个接收:

/**

逐个接收请求参数:

要求:处理器对象的形参名和请求中参数名必须一致

同名的请求参数赋值给同名的形参

框架接收请求参数:

框架会提供类型转功能

400状态码:客户端错错误,表示提交请求过程中,数据类型转换发生问题

*/

 

/**

*

请求中,参数名和处理器方法的形参名不一致

@RequestParam:解决逐个接收请求中参数名和形参名不一致的问题

属性:1)value(可省略)请求中参数名称

2)required是一个boolean,默认true表示请求中必须包含此参数

位置:在形参定义前面

*/

publicModelAndViewdoParam(@RequestParam(value="rname",required=false)Stringname,@RequestParam(value="rage",required=false)Integerage){

处理器方法的返回值

ch04-return :   处理器放方法的返回值表示请求的处理结果

1:ModelAndView:有数据和视图,对试图执行forward.

2:String 表示视图   ,可以逻辑名称,也可以是完整视图路径

3:void:不能表示数据,也不能表示视图。

       在处理ajax请求的时候,可以使用void返回值。通过HttpServletResponse输出数据,相应Ajax请求。

       Ajax 请求服务器端返回的是数据,和视图无关。

4:object:例如String Integer Map,List等等

   对象有属性,属性就是数据,所以返回object表示数据,与视图无关。

   可以使用·对象表示·数据,响应Ajax请求

 现在做Ajax,主要是哟使用json的数据格式。实现步骤:

 1:加入处理json的工具库依赖  Jackson依赖

 2:在springmvc配置文件中加入<mvc:annotation-driven> 注解驱动 作用:将Java对象转成json

    json =  ow.writeValueAsString(student);

 3:在处理器方法的上面加入@responseBody注解

         response.setContentType("application/json;charset=utf-8");

         PrintWriter pw = response.getWriter();

         pw.println(json);

返回对象 Object

处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。

现在做ajax, 主要使用json的数据格式。 实现步骤:

1.加入处理json的工具库的依赖, springmvc默认使用的jackson。

<!--jackson依赖-->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.9.0</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.9.0</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.9.0</version>

</dependency>

 

2.在sprigmvc配置文件之间加入 mvc:annotation-driven 注解驱动。

<!--加入注解驱动处理json-->

<mvc:annotation-driven/>

3.在处理器方法的上面加入@ResponseBody注解

@RequestMapping(value="/doStudent.do")

@ResponseBody

publicStudentdoStudent(Stringname,Integerage){

Studentstu=newStudent();

stu.setName("李四同学");

stu.setAge(20);

returnstu;

}

返回String表示数据

/**

*处理器方法返回String,String表示数据,不是视图

*区分返回值String是数据还是视图,看有没有@ResponseBody注解

*有该注解是表示数据,没有该注解表示视图

*

*默认使用text/plain;charset=ISO-8859-1作为contentType,导致中文乱码

*解决方案:给@RequestMapping增加一个属性,produces,使用这个属性指定一个新的contentType

*/

@RequestMapping(value="/doStringData.do",produces="text/plain;charset=utf-8")

@ResponseBody

publicStringdoStringData(Stringname,Integerage){

return"hellospringMVC返回对象,表示数据";

}

解读url-pattern  解决静态资源文件问题

可以写为/,因为 DispatcherServlet 会将向静态资源的获取请求,例如.css、.js、.jpg、.png等资源的获取请求,当作是一个普通的 Controller 请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源获取请求也均会报 404 错误。

tomcat本身能处理静态资源的访问, 像html, 图片, js文件都是静态资源

使用斜杆 / 当这里使用了 / tomcat中的default Servlet就没有了导致所有的静态资源都给DispatcherServlet处理, 默认情况下DispatcherServlet没有处理静态资源的能力。没有控制器对象能处理静态资源的访问。所以静态资源(html,js,图片,css)都是404.

<servlet-mapping>

<servlet-name>myweb</servlet-name>

<!--

使用框架的时候,url-pattern可以使用两种值

1:使用扩展名,语法*.xxxx,xxxx是自定义扩展名,常用的有*.do*.action*.mvc等

2:使用斜杠"/"

当使用了/,他会替代tomcat中的default

导致所有的静态资源都交给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力。

没有控制器对象能处理静态资源的访问。所以静态资源(html,css,js,图片)都是404

动态资源some.do是可以访问的,因为我们的程序中有MyController控制器对象,能处理some.do的请求。

-->

<url-pattern>/</url-pattern>

</servlet-mapping>

第一种解决方案:

<!--加入注解驱动处理json-->

<!--

<mvc:default-servlet-handler/>和@RequestMapping注解有冲突,需要加入<mvc:annotation-driven/>解决这个冲突

-->

<mvc:annotation-driven/>

<!--第一种处理静态资源禁止访问的方式

需要在配置文件中加入<mvc:default-servlet-handler/>

原理是:加入这个标签后,框架会创建控制器对象DefaultServletHttpRequestHandler(类似与我们自己创建的myController)

DefaultServletHttpRequestHandler这个对象可以把接收的请求转发给tomcat的default这个servlet

-->

<mvc:default-servlet-handler/>

解决方案2:

<!--第二种处理静态资源的方式

mvc:resources:加入后框架会创建DefaultServletHttpRequestHandler这个处理器对象

让这个对象处理静态资源的访问,不依赖tomcat服务器。

mapping:访问静态资源的uri地址,使用通配符**

location:静态资源在你项目中的位置。

-->

<mvc:resourcesmapping="/picture/**"location="/picture/"/>

<mvc:resourcesmapping="/html/**"location="/html/"/>

<mvc:resourcesmapping="/js/**"location="/js/"/>

<!--使用一个配置语句,指定多种静态资源的访问-->

<!--<mvc:resourcesmapping="/static/**"location="/static/"/>-->

<!--

mvc:resources和@RequestMapping注解有冲突,需要加入<mvc:annotation-driven/>解决这个冲突

-->

<mvc:annotation-driven/>

路径问题

ch06-path:解决jsp页面中路径问题, 用" / " 还是不用

在jsp ,  html中使用的地址,都是在前端页面中的地址,都是相对地址

地址分类:

 1:绝对地址  带有协议名称的是绝对地址 http://www.baidu.com

 2:相对地址  没有协议开头的 例如:text/some.do  , /text/some.do

        相对地址不能独立使用,必须有一个参考地址。通过  参考地址 + 相对地址本身 才能指定资源。

 3:参考地址

      1) 在你的页面中,访问地址不加 " / "

           访问的是:http://localhost:8080/ch06_path_war_exploded/index.jsp

           路径:http://localhost:8080/ch06_path_war_exploded/

           资源:index.jsp

           在index.jsp发起的是  text/some.do 请求 访问地址:http://localhost:8080/ch06_path_war_exploded/text/some.do

           参考地址:http://localhost:8080/ch06_path_war_exploded/

           当你的地址没有" / " 开头时 例如 text/some.do  ,当你点击链接时,访问地址是你当前页面的 路径 + 链接(资源)的地址

           http://localhost:8080/ch06_path_war_exploded/ + text/some.do

           可以使用base标签

      2) 在页面中,访问地址添加" /  "

             访问的是:http://localhost:8080/ch06_path_war_exploded/index.jsp

             路径:http://localhost:8080/ch06_path_war_exploded/

             资源:index.jsp

             在index.jsp发起的是  /text/some.do 请求   访问地址:http://localhost:8080/text/some.do

             参考地址:http://localhost:8080/

             如果资源无法访问,在你的路径前面加入${pageContext.request.contextPath}

              <p><a href="${pageContext.request.contextPath}/text/some.do">发起some.do的get请求</a></p><br/>

 4. 解决路径问题:

             1)访问地址添加" /  "  加入  ${pageContext.request.contextPath}

             2)访问地址不加 " / " 使用base标签

                                     <%

                                        String basePath = request.getScheme() + "://" +request.getServerName() + ":" +

                                        request.getServerPort() + request.getContextPath() + "/" ;

                                     %>

                                     <head>

                                         <title>Title</title>

                                         <base href="<%=basePath%>" />

                                     </head>

SSM整合开发

SSM整合开发

SSM: SpringMVC + Spring + Mybatis

SpringMVC:视图层,界面层,负责接收请求,显示处理结果的。

Spring :业务层,管理service,dao,工具类对象的。

Mybatis:持久层,访问数据库的。

 用户发起请求----->SpringMVC接收------>调用Spring中的service对象------>Mybatis访问数据库

 SSM整合也叫做SSI(IBatis也就是Mybatis的前身),整合中有容器。

 1:第一个容器 SpringMVC容器,管理Controller控制器对象的。

 2:第二个容器 Spring容器,管理service,dao,工具类对象的

 我们要把使用的对象交给合适的容器创建,管理。把controller还有web开发的相关对象

 交给SpringMVC容器,这web用的对象写在SpringMVC配置文件中

 service,dao对象定义在spring的配置文件中。让spring管理这些对象。

 SpringMVC容器 和 spring容器是有关系的,关系已经确定好了。

 SpringMVC容器 是 spring容器的 子容器,类似于Java中的继承,子可以访问父的内容。

 在子容器中的controller可以访问父容器中的service对象,就可以实现controller使用service对象。

实现步骤:

   1:创建maven项目

   2:加入依赖

        springmvc spring mybatis三个框架依赖,Jackson依赖,MySQL驱动,druid连接池,

        jsp,servlet依赖、

   3:写web.xml配制文件

        1)注册DispatcherServlet, 目的:1、创建springmvc容器对象,才能创建controller类对象。

                                      2、创建的是servlet,才能接收用户的请求

        2)注册Spring的监听器:ContextLoaderListener ,目的:创建spring的容器对象,才能创建service,dao等对象

        3)注册字符集过滤器,解决post请求乱码问题

   4:创建包,controller包,dao包,service包,实体类包名创建好

   5:写springmvc spring mybatis的配置文件

     1)springmvc配置文件

     2)spring配置文件

     3)mybatis配置文件

     4)数据库的属性配置文件

   6:写代码 dao接口和mapper文件,    service和实现类,controller,实体类

   7:写jsp页面

全局异常处理

ch10-异常处理: 异常处理

两个注解的使用:

    @ControllerAdvice

@ControllerAdvice: 控制器增强(也就是说给控制器类增加功能--异常处理功能)

*位置:在类的上面。

*特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。

*指定@ControllerAdvice所在的包名

    @ExceptionHandler

@ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法处理

@ExceptionHandler(value=nameException.class)

异常处理的步骤:

1:创建maven项目

2:加入依赖

3:新建一个自定义异常类,MyUserException ,在定义它的子类 nameException ageException

4:在controller中抛出 nameException ageException

5: 新建一个普通类,作为全局异常处理类

  1)在类的上面加@ControllerAdvice

  2)在类中定义方法,在方法上加 @ExceptionHandler

6:创建异常的视图页面

7:创建springmvc配置文件

<!--处理异常需要的两步-->

<context:component-scan base-package="com.ning.handler"/>

<mvc:annotation-driven/>

  1、组件扫描器,扫描@Controller注解

  2、组件扫描器,扫描@ControllerAdvice

  3、声明注解驱动

拦截器

拦截器:

1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。

2)拦截器和过滤器类似,功能方向侧重点不同。 过滤器是用来过滤器请求参数,设置编码字符集等工作。

拦截器是拦截用户的请求,做请求做判断处理的。

3)拦截器是全局的,可以对多个Controller做拦截。

一个项目中可以有0个或多个拦截器, 他们在一起拦截用户的请求。

拦截器常用在:用户登录处理,权限检查, 记录日志。

拦截器的使用步骤:

1.定义类实现HandlerInterceptor接口

2.在springmvc配置文件中,声明拦截器, 让框架知道拦截器的存在。

拦截器的执行时间:

1)在请求处理之前, 也就是controller类中的方法执行之前先被拦截。

2)在控制器方法执行之后也会执行拦截器。

3)在请求处理完成后也会执行拦截器。

4)拦截器:看做是多个Controller中公用的功能,集中到拦截器统一处理。

使用的aop的思想

拦截器和过滤器的区别

1.过滤器是servlet中的对象, 拦截器是框架中的对象

2.过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor

3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。 拦截器是用来验证请求的,能截断请求。

4.过滤器是在拦截器之前先执行的。

5.过滤器是tomcat服务器创建的对象

拦截器是springmvc容器中创建的对象

6.过滤器是一个执行时间点。

拦截器有三个执行时间点

7.过滤器可以处理jsp,js,html等等

拦截器是侧重拦截对Controller的对象。 如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容

8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应

标签:拦截器,请求,springMVC,视图,对象,springmvc,servlet
来源: https://blog.csdn.net/XUN__MLF/article/details/122507799

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有