SpringMVC配置解析和工作流程

视图解析器:

我们一般将 不让用户访问的 页面 放进:在web-inf中的页面是受保护的。

我们将页面放在 web-inf下自定包view中:

我们添加视图的时候:前缀和后缀都重复了,我们的框架也知道帮我们省去重复的地方。

这时候我们就配置一个 视图解析器:

怎么配置视图解析器中的 属性:

内部视图资源分析器。

 

代码一:

关键代码:

SpringMVC.xml (SpringMVC的配置文件):

核心代码:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

//这里的这个<bean>标签是用来 表明 这个 NewController这个类 是可以 处理 ‘/some.do’这个请求的。必须加 / 斜杠是用来区分的,有这个斜杠表明 我们的这个处理器 可以 处理 请求,还有可以处理的请求的名字 。

  <bean id="/some.do" class="com.bjpowernode.myController.NewController"/>

 

//这个<bean>标签 是用来 创建一个 内置 视图资源 分析器 对象的。

// 这个 InternalResourceViewResolver 这个类 的 父类中有两个参数,分别为:

//ModelAndView 中  model是 数据的意思,view是视图的意思。

//prefix 代表 View 这个视图的  前缀(/WEB-INF/view) 。

// suffix 代表 视图的 后缀 (.jsp)

 

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

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

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

 </bean>

 </beans>

 

Web.xml 配置文件中的核心的代码:

<servlet>

<servlet-name>SpringMVC</servlet-name>

//创建一个 中央处理器对象,这个中央处理器对象是用来 接收用户的请求和响应用户结果的。起到了 调度这种xxx器的。

//我们的 org.springframework.web.servlet.DispatcherServlet 这个类当创建的时候,启动我们的init方法,在方法中 会 读取 【配置文件】,读取的这个配置文件,默认的位置是在:

WEB-INF目录下的 【<servlet-name>名称-servlet.xml】这个文件,所以如果我们不进一步进行设置,使用默认的,那么我们本代码就要 去 WEB-INF目录下创建一个 SpringMVC-servlet.xml的配置文件。

//我们一般不使用我们的默认情况下配置方式。

 

//org.springframework.web.servlet.DispatcherServlet的父类有一个参数:contextConfigLocation这个参数的值 就是 init方法 读取配置文件时 配置文件的 位置。

所以我们 这时候手动 为这个contextConfigLocation 参数赋值,这样在init方法在 读取配置文件的时候就会 去我们 自定义的位置 去 找我们的 配置文件。

我们的配置方式一般是:classpath:SpringMVC.xml  去 类路径下找 我们SpringMVC.xml配置文件。

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

    <init-param>

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

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

    </init-param>

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

   </servlet>

   <servlet-mapping>

    <servlet-name>SpringMVC</servlet-name>

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

   </servlet-mapping>

 

代码二:

以注解的方式 声明和创建一个 处理器:

@Controller //这个注解说明  这个 类 是一个 处理器 。

public class NewController{

@RequestMapping(value="/some.do")//只要 web项目 名后面的 /xxx.do 这样的。

public ModelAndView doSome(){

ModelAndView mv = new ModelAndView() ;

mv.addObject("massage", "holleWorld!!!");

mv.setViewName("Show");

return mv;

}

}

修改为注解的方式创建一个处理器了,所以就不能使用我们的<bean>标签来进行创建对象了,

所以我们应该使用我们  扫描器的方式来创建我们的  处理器对象。

 

不用实现  controller 这个接口,也不用实现这个接口中的ModelAndView handleRequest()这个方法。handleRequest这个方法就相当于以前的 doGet和doPost这两个方法。

 

代码三:

如果 url-pattern 标签对中的值 修改为 / 表示任意的请求都可以接受,但是这时候 我们的 代码中 也就是我们的 以注解的方式 声明的 一个 处理器MyController这个处理器 中 只有一个 处理 some.do请求的 dosome 处理方法。 所以 如果想要通过请求访问 我们的 静态资源,也就是我们的 html 和 图片 资源就没有办法访问,因为我们的 中央调度器 没有办法 找到 与请求静态资源 相对应的  处理器的处理方法。 所以会报 404 的错误。

 

后面介绍到了: 每一个处理器中 可以有很多个 处理请求的方法,每一个方法 又可以 处理很多种 不同的请求 。 如果中央处理器 不能找到 对应的 处理器 来处理这个请求,那么就会显示404。

 

代码四:

 我们上面的代码将我们的 url-pattern 标签对中的数值修改为 / ,这样就不能访问我们的静态资源了。 解决这种 情况的 方法 有两种: 一种是利用tomcat中的对象来处理,一种是利用框架自己的 对象来处理。

(1)第一种:使用tomcat内置的对象来处理。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

  <context:component-scan base-package="com.bjpowernode.myController"/>

 

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

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

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

  </bean>

  <!-- 这个是使用 tomcat服务器中的 default来处理和接收我们的 静态资源的请求 -->

  <mvc:default-servlet-handler/>

  <!-- 需要注意的是: 当我们 配置完这个标签后,虽然我们是可以请求静态资源了,但是我们的 动态资源不能请求了,因为 mvc请求静态资源和我们的动态资源有有矛盾 -->

  <!-- 所以这时候 我们需要 重新配置一下我们的 如何 处理我们的 动态资源的标签 -->

<!--下面这个标签时必须加的用来 消除静态资源(html和图片)请求和动态资源请求之间的矛盾, 是因为@RequestMapping和default-servlet-handler有冲突。->

  <mvc:annotation-driven/> 

  <!-- 上面这个标签就可以消除 我们请求动态资源和请求静态资源 的矛盾,这个标签的实质的意思是:注解驱动 -->

 </beans>

******//<img src> ,<form>标签的 action ,超链接的href,请求转发中的地址  他们的 根目录都是我们的 http:localhost:8080 ,如果我们不加 任何的斜杠,那么就从当前页面找起,也就是我在index.jsp页面中通过传统方式发出一个请求,那么当前这个请求的根目录就是当前jsp页面的根目录。 如果我加上一个斜杠那么,当前请求的根目录就是 http:localhost:8080 我们就必须加上 /项目名/请求.do

  1. 第二种 :框架 自己 帮我们 接收请求和处理请求。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

  <context:component-scan base-package="com.bjpowernode.myController"/>

 

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

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

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

  </bean>

  // /images/** 这个的意思是:只要访问的方式中带有/images/的请求那么我们就去

//location="/images/" 这个目录下去找对应的资源。

  <mvc:resources location="/images/" mapping="/images/**"/>

  <mvc:resources location="/html/" mapping="/html/**"/>

 

//<mvc:resources/> 这个标签也是和我们的 @RequestMapping注解有冲突,所以我们也必须加一个注解驱动。

  <mvc:annotation-driven/>

 </beans>

 

 

代码五:

我们使用 注解的 方式 声明一个 创建器 , 这个创建器类中 有很多个处理  请求的 方法,而且每个 方法 都可以 处理  多个多种不同的 请求。

代码如下:

package com.bjpowernode.myController;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

 

import com.sun.javafx.sg.prism.NGShape.Mode;

 

@Controller //这个注解说明  这个 类 是一个 处理器 。

public class NewController{

@RequestMapping(value={"some.do","first.do"})//这个地方我们加不加 /都是可以的,所以最好不要加了。

public ModelAndView doSome(){

ModelAndView mv = new ModelAndView() ;

mv.addObject("massage", "执行的是 doSome方法!!!");

mv.setViewName("Show");

return mv;

}

 

@RequestMapping(value={"other.do","secound.do"})

public ModelAndView doOther(){

ModelAndView mv = new ModelAndView() ;

mv.addObject("massage","执行的是 doOther方法!!!");

mv.setViewName("Show");

return mv ;

}

}

**** 使用的 规则:

@RequestMapping(value={请求1,“请求2”,“请求3”})

Public ModelAndView 方法名1(){

}

@RequestMapping(value={请求4,“请求5”,“请求6”})

Public ModelAndView 方法名2(){

}

 

我们的 这些 请求1,请求2,请求3,请求4 这些请求 都可能 有重复的 部分。

如:

user/some.do

user/other.do

user/first.do

user/secound.do

这些请求 都 有 一个共同的部分: 那就是 user/部分。

这时候我们就应该 在类添加一个注解: @RequestMapping 注解。

在类上面使用:    @RequestMapping(value=“请求共同的部分”)

在方法上面使用:  @RequestMapping(value=请求的不共同部分,因为共同的部分会由框架 自动添加上去

例题如下:

代码如下:

强制规定 访问的方式:

package com.bjpowernode.myController;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

 

import com.sun.javafx.sg.prism.NGShape.Mode;

 

@Controller //这个注解说明  这个 类 是一个 处理器 。

@RequestMapping(value="user/")

public class NewController{

@RequestMapping(value={"some.do","first.do"})//这个地方我们加不加 /都是可以的,所以最好不要加了。

//如果我们 不强制加 访问方式的属性,也就是 method=RequestMethod.get/post 。那么不管是通过什么方式(get,post方式)发出的请求,只要是some.do或者是first.do 就可以访问这个方法。

public ModelAndView doSome(){

ModelAndView mv = new ModelAndView() ;

mv.addObject("massage", "执行的是 doSome方法!!!");

mv.setViewName("Show");

return mv;

}

//这个只能通过post方式来远程访问,和调用这个方法,get方式不行。 

@RequestMapping(value={"other.do","secound.do"},method=RequestMethod.POST)

public ModelAndView doOther(){

ModelAndView mv = new ModelAndView() ;

mv.addObject("massage","执行的是 doOther方法!!!");

mv.setViewName("Show");

return mv ;

}

}

当 请求中的参数给 方法中的形参赋值的时候就会出现400的这种错误。

最常见的报400的 异常为 类型转换异常: 也就是 说 一个string类型的 参数 转换成 int类型的形参,就可能会出现类型转换异常,为了避免输入框中 因为””空值 或者什么都不输入的情况下 给 形参赋值时 出现数据转换异常 所以 整数类型 我们不采用 int类型,而是采用它的封装类integer。

 

如果 请求中的参数名 和  方法中的形参名不相同,我们必须使用:

@Requestparam(value=”请求中参数名”  required=“true/false”)  

 true:表示请求中必须有此参数。

 false:表示参数可以没有,没有就  赋值为  null(空)。

 

 

补充知识点:当我们使用post方式提交的时候:会出现中文乱码的情况,我们如何解决呢?

使用 过滤器 ,所有的请求全部都要经过一次过滤器才行,经过过滤器的处理,也就是经过过滤器设置好字符集。

三个圆圈 是 这个这个类的三个属性。

 

我们使用 springMVC 这个 框架 我们可以发现的是: 我们从头到尾我们 都没有通过自己来创建任何一个 对象,除了一个无关紧要的 ModelAndView这个结果对象。

  1. 我们 不需要 创建 【处理器对象】:我们利用 Spring容器创建处理器对象的两种方式。
    • 利用注解
    • 创建一个<bean>对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值