一、确定要引用的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
搜索方案:
要把依赖都加进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)
搜索解决方案:
原来是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的方式