springMVC

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项目

需求:用户在页面发起一个请求,请求交给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请求响应

上一篇:framework学习笔记day10---SpringMVC基础


下一篇:Java-SpringMVC配置详解