【001】引入Spring MVC

一、确定要引用的spring的jar包 

当然我们一开始并不知道spring mvc需要使用到哪些包,但是我们可以从最基本的开始

1、首先使用spring当然少不了spring最基础的jar包spring-bean  和spring-content,在nexus私服服务器上搜索这两个包的最新版本在pom文件中进行引用

  <dependencies>
      <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
  </dependencies>
View Code

2、在web中配置spring mvc中的调度员servlet(spring中实现的一个servlet调度类):org.springframework.web.servlet.DispatcherServlet

<?xml version="1.0" encoding="UTF-8" standalone="no"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
            load-on-startup 配置解释:当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,正数的值越小,启动该servlet的优先级越高;
            当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载  
        -->
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/nutrition/*</url-pattern>
      </servlet-mapping>
</web-app>
View Code

3、配置spring的配置文件

在web.xml文件中配置spring配置发文件的位置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext-*.xml</param-value>
  </context-param>
View Code

也可以使用如下配置

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:springmvc-servlet.xml</param-value>
        </init-param>
        <!--
            load-on-startup 配置解释:当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,正数的值越小,启动该servlet的优先级越高;
            当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载  
        -->
        <load-on-startup>1</load-on-startup>
      </servlet>
View Code

然后在resource中直接配置spring的xml配置文件

<?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"
    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">
    <context:component-scan base-package="cn.ffcs.nutrition.controller" />
</beans>
View Code

4、将项目部署到容器中启动

报错:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

搜索查询发现是spring-webmvc jar包中的类,pom加载该类最新包,再重启。

发现还是报错:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

搜索方案:https://www.cnblogs.com/lyy-2016/p/5898537.html

要把依赖都加进classpath下。步骤:

项目右击-->properties-->Deployment Assembly-->add-->Java Build Path Entries-->导入所有依赖的Jar包,重新start tomcat即可。

按照方案修改后还是报错:java.lang.UnsupportedClassVersionError: org/springframework/web/servlet/DispatcherServlet : Unsupported major.minor version 52.0 (unable to load class org.springframework.web.servlet.DispatcherServlet)

搜索解决方案:https://www.cnblogs.com/xing901022/p/4172410.html

原来是jar包与jdk版本不一致导致的,发现引用的spring的5.x系列的是在 jdk1.8下进行编译的,但是环境使用的版本是1.7,那么更改jar包的版本采用4.x系列的,重启tomcat无报错。

最后我们发现spring-mvc使用的基本包只有如下几个(部分还是依赖引用的)

二、编写一个样例controller

1、controller类IndexController.java

package cn.ffcs.nutrition.controller.index;


import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value="/nutrition")
public class IndexController{
    @RequestMapping(value="/index")
    public String index(HttpSession session, ModelMap map) {
        return "/WEB-INF/jsp/frame/index.jsp";
    }
    @RequestMapping(value="/left")
    public String left(HttpSession session, ModelMap map) {
        return "/WEB-INF/jsp/frame/left.jsp";
    }
    @RequestMapping(value="/switch")
    public String switchhtm(HttpSession session, ModelMap map) {
        return "/WEB-INF/jsp/frame/switch.jsp";
    }
    @RequestMapping(value="/top")
    public String top(HttpSession session, ModelMap map) {
        return "/WEB-INF/jsp/frame/top.jsp";
    }
}
View Code

2、视图index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>My Page</title>
</head>
    <body>
        hello!
    </body>
</html>
View Code

三、启动tomcat然后访问

1、启动后访问:http://localhost:8083/selfproject-nutrition/nutrition/index,但是报404错误

查看tomcat启动日志,发现如下的提示信息有问题

validateJarFile(I:\develop\tomcat-8083\webapps\selfproject-nutrition\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

信息Offending表示冲突的意思,证明servlet-api-2.5.jar冲突了,检查tomcat工程目录下的jar包发现没有重复加载包

于是想到了可能是tomcat的lib下自带的jar包可能有冲突了,检查之果然有相同的servlet的jar包,应该怎么做呢?

再网上搜了下处理方法是这样的:

再pom文件引用的servlet-api包的配置中加入如下的信息<scope>provided</scope>,因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了

      <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency> 
View Code

然后再重启tomcat,访问发现还是有问题。

查看部署项目里面的lib目录里面任然有servlet-api的包,原来是内容一中的第4部操作里面的“项目右击-->properties-->Deployment Assembly-->add-->Java Build Path Entries-->导入所有依赖的Jar包”引起的,

<scope>provided</scope>的配置应该是指maven编译的项目里面会过滤掉这个包,但是在eclipse中的上述配置,是eclipse行为,它将maven引用的包(无论是何种用途)在部署tomcat时将maven的依赖包全部都放到项目的lib目录下

如果是用maven编译的war包,那么war包里面的lib就不会包含<scope>provided</scope>标记的内容了(有待证实验证哦,这里是猜测 )

解决方法:去掉pom文件中的servlet引用,改为通过新建libraries引用的方式来通过项目加载引用servlet包,这样“项目右击-->properties-->Deployment Assembly-->add-->Java Build Path Entries-->导入所有依赖的Jar包”导入的maven引用包里面就没有servlet包了

操作路径:项目右键》build path》libraries》add library》user library》next》user libraries》new,新建一个library然后再library中add jars (servlet-api),然后选中新建的library(如图所示),即可。

2、重新启动tomcat,访问路径:http://localhost:8083/selfproject-nutrition/nutrition/index,报404

查看tomcat日志:

信息: Loading XML bean definitions from URL [file:/I:/develop/tomcat-8083/webapps/selfproject-nutrition/WEB-INF/classes/springmvc-servlet.xml]
六月 20, 2018 8:44:46 下午 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
信息: Mapped URL path [/nutrition/index] onto handler 'indexController'
六月 20, 2018 8:44:46 下午 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
信息: Mapped URL path [/nutrition/index.*] onto handler 'indexController'
六月 20, 2018 8:44:46 下午 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
信息: Mapped URL path [/nutrition/index/] onto handler 'indexController'
View Code

再打印日志的末尾出现

警告: No mapping found for HTTP request with URI [/selfproject-nutrition/nutrition/index.html] in DispatcherServlet with name 'springmvc'

明明已经load路径成功了,但是任然报错找不到,是什么原因呢?

在网上搜索springmvc的url在web里面的配置只能是   /   /*   *.jsp  这几种模式,  使用<url-pattern>/nutrition/*</url-pattern>的话spring中的控制层会将url中的nutrition去掉然后匹配注册的路径。

这时候增加一个nutrition就可以访问到内容了:http://localhost:8083/selfproject-nutrition/nutrition/nutrition/index.html

为了方便还是讲路径改为后缀 *.jsp的方式

猜你喜欢

转载自www.cnblogs.com/liushi805347332/p/9136845.html