视图解析器:
我们一般将 不让用户访问的 页面 放进:在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
- 第二种 :框架 自己 帮我们 接收请求和处理请求。
<?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这个结果对象。
- 我们 不需要 创建 【处理器对象】:我们利用 Spring容器创建处理器对象的两种方式。
- 利用注解
- 创建一个<bean>对象