javaweb实训第五天下午——SpringMVC基础(2)

简介: 3.10.常见问题

javaweb实训第五天下午——SpringMVC基础(1)https://developer.aliyun.com/article/1415095

3.10.常见问题

部署项目,启动Tomcat报错,错误信息如下:


原因是:没找到/WEB-INF/springmvc-servlet.xml文件,因为在启动Tomcat服务器的时候会加载web.xml文件,接着初始化SpringMVC中的DispatcherServlet,而这个DispatcherServlet会根据初始化配置加载框架配置文件,如果配置出错,或文件位置不正确,那么会默认加载路径为:/WEB-INF/-servlet.xml的文件;

20210602151215117.png

解决问题方式1:

可以把我们的配置文件更名为springmvc-servlet.xml,然后拷贝到WEB-INF中:

20210602151223862.png

解决问题方式2【推荐】

一般会将spring系列的配置文件都在放在src中或者resources(没有可以新建)中,我们可以通过以下配置告诉SpringMVC我们的配置文件路径:


20210602151227304.png

4.前端控制器配置

Spring的前端控制器拦截匹配规则(即 … )可以自己定义:

4.1. *.xxx(后缀匹配或扩展名匹配)

.xxx这个拦截固定结尾的url,常见的如.do、*.json、.action等等,这是最传统的方式;

在实际项目开发中一般会要求遵守restful风格,后缀匹配是匹配不了的;

例如:查看id为1001的用户信息:/users/1001

不会导致静态文件(.jpg、.js、.css)被拦截,只有以.xxx结尾的请求才会经过DispatcherServlet处理;

4.2. /*

/*会拦截所有url(包括/login、.jsp、.js、png和.html等),一般只用在过滤器上;

既然/*会拦截*.jsp,会出现访问jsp视图时被Spring的DispatcherServlet拦截,导致找不到请求资源引入的404错误,其他资源也一样,所以在SpringMVC的前端控制器中配置/*,是一个错误的配置方式;

4.3. /(现在最流行的配置方式)

/也是拦截所有,只不过不会拦截*.jsp;

/不会拦截.js、.css、.png、.html、*.jsp等后缀型url;

但是/匹配覆盖了Tomcat的默认控制器,导致静态资源访问失效,静态资源也被拦截,只有.jsp不会被拦截;

如果想访问静态资源,必须要开启静态资源访问权限;

注意:Tomcat本身自带有一个默认控制器,匹配方式也是"/",这个默然控制器用于处理静态资源请求。如果我们配置SpringMVC前端控制器为"/",那么Tomcat的默认控制器就不生效,导致静态资源无法访问;

Tomcat/conf/web.xml:

<servlet>
        <servlet-name>default</servlet-name>
   <!-- 处理静态资源,如图片、*.css、*.js、*.html等 -->
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

设置静态资源可以访问:

解决办法:SpringMVC开启静态资源控制器

20210602151513475.png

spring-mvc.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">
  <!-- 静态资源放行:相当于Tomcat默认控制器的功能 -->
  <mvc:default-servlet-handler />
  //其它配置略
</beans>

5.业务处理控制器的三种实现

实现Controller接口;

实现HttpRequestHandler接口;

普通类(pojo)和注解 @RequestMapping;

5.1.第一种:实现Controller接口

控制器:

//实现Controller接口
public class Controller01 implements Controller{
  @Override
  public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println(this.getClass());
    //模型数据和视图对象
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/WEB-INF/controller.jsp");
    return modelAndView;
  }
}

配置:

<bean id="/controller01.form" class="cn.itsource.springmvc._02_controller.Controller01"></bean>

5.2.第二种:实现HttpRequestHandler接口

控制器:

//实现了HttpRequestHandler接口
public class Controller02 implements HttpRequestHandler{
  @Override
  public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
    System.out.println(this.getClass());
    request.getRequestDispatcher("/WEB-INF/controller.jsp").forward(request, response);
  }
}

配置:

<bean id="/controller02.do" class="cn.itsource.springmvc._02_controller.Controller02"></bean>

5.3.第三种:普通类加注解(建议使用)

POJO(Plain Ordinary Java Object):简单的Java对象,实际就是普通JavaBean没有继承类,也没有实现类;

控制器:

/**
 * SpringMVC中的Controller就是单例的(使用成员变量请注意线程安全问题)
 * 注:不要忘了,配置全注解扫描包才能认识@Controller
 * @author Administrator
 */
@Controller
public class Controller03{
  @RequestMapping("/method01.form") //配置访问路径
  public ModelAndView method01(){
    System.out.println(this.getClass()+":method01");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/WEB-INF/controller.jsp");
    return modelAndView;
  }
  @RequestMapping("/controller/method02.form") //配置访问路径
  public ModelAndView method012(){
    System.out.println(this.getClass()+":method02");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("/WEB-INF/controller.jsp");
    return modelAndView;
  }
}

注意事项:

1.要使用@Controller注解(创建对象的注解),就需要配置:

<!-- 扫描包路径:会扫描cn.itsource包及其子包下所有的类,如果类上面有实例化Bean的注解(例如:@Controller),容器就会创建该类的实例,并交给容器管理。否则不创建 -->
<context:component-scan base-package="cn.itsource" />

2.要使用@RequestMapping注解(请求映射注解),就需要配置:

<!-- 开启spring对mvc的支持:即能够使用@RequestMapping注解 -->
<mvc:annotation-driven></mvc:annotation-driven>

6.全注解

  1. Spring不仅支持xml配置,也支持注解配置,使用注解配置会提高开发效率;
  2. SpringMVC中控制器建议使用注解方式,是官方推荐的,外面公司也是使用此方式;
  3. 常用注解分三种:
  1.  (1)第一种:实例化bean的注解
      (2)第二种:注入注解
      (3)第三种:请求映射(匹配)注解

6.1.请求映射(匹配)注解

  1. 请求匹配可以使用@RequestMapping注解实现,该注解可以作用在类上和方法上;
  2. 需要在XML配置Spring对mvc注解支持功能,能识别@RequestMapping:

20210602151944891.png

3.指定请求方法:@RequestMapping(value = “/upload”, method = RequestMethod.GET)

6.2.实例化bean的注解

指定一个包路径,Spring会自动扫描该包及其子包所有类,当发现类定义前有特定的注解标记时,就将该类的对象实例化并纳入到Spring容器中,等价于原有XML配置中定义功能;

组件扫描可以替代大量XML配置的定义;

需要在XML配置中指定扫描路径:

以上配置,容器在实例化对象时会自动扫描cn.itsource包及其子包下所有类,如果有多个包可以再写一条;

指定扫描类路径后,并不是该路径下的所有组件类都扫描到Spring容器的,只有在组件类定义前面有以下标记时,才会扫描到Spring容器;

2021060215222585.png

6.3.注入注解

具有依赖关系的Bean对象,利用此注解可以实现关系注入:@Autowired、@Resource

这些注解标记可以用在字段定义或setter方法定义前面,一般用于注入容器中对象,该注解可以直接写在字段上,那么就不需要setter方法了;

注意:使用该注解之前,一定要确保容器中是否有该类型的对象,否则注入失败;

javaweb实训第五天下午——SpringMVC基础(3)https://developer.aliyun.com/article/1415109?spm=a2c6h.13148508.setting.16.6e1a4f0eQzpjQW

目录
相关文章
|
4天前
|
XML JSON JavaScript
javaweb实训第六天上午——JSON&SpringMVC进阶(1)
1.课程介绍 JSON; (了解) SpringMVC返回JSON; (掌握) SpringMVC文件上传、下载; (掌握) SpringMVC拦截器; (掌握) SpringMVC执行流程; (掌握) 2.JSON 2.1.JSON概述
58 0
|
4天前
|
JSON 前端开发 Java
javaweb实训第五天下午——SpringMVC基础(4)
7.3.向页面传值 传递数据就是Controller往前台(页面)传递数据;
56 0
|
4天前
|
开发框架 前端开发 Java
javaweb实训第五天下午——SpringMVC基础(1)
1.课程介绍 SpringMVC概述; (了解) SpringMVC入门; (掌握) 前端控制器配置; (掌握) 业务控制器的三种实现; (掌握) 全注解; (掌握) 控制器常用操作(接收数据,向页面传值,重定向转发); (掌握)
40 0
|
4天前
|
JSON 前端开发 Java
javaweb实训第六天上午——JSON&SpringMVC进阶(2)
5.SpringMVC拦截器 5.1.创建拦截器
57 0
|
4天前
|
JSON Java 数据格式
javaweb实训第五天下午——SpringMVC基础(3)
7.控制器常用操作 控制器除了处理请求并返回视图以外,还需要一些事情,比如接收页面请求参数、绑定数据到页面、返回json数据、文件上传、文件下载等;
32 0
|
XML 前端开发 JavaScript
【知识】了解Web、JavaWeb、SpringMVC、SpringBoot
【知识】了解Web、JavaWeb、SpringMVC、SpringBoot
184 0
|
存储 前端开发 Java
JavaWeb - Spring容器 & SpringMVC容器 & Web容器的关系
JavaWeb - Spring容器 & SpringMVC容器 & Web容器的关系
211 0
JavaWeb - Spring容器 & SpringMVC容器 & Web容器的关系
|
4天前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
4天前
|
Java Apache vr&ar
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
17 0