主要记录下学习过程中遇到的问题,重点在第二项。
一、新建Spring MVC工程
1、新建工程,取名JWebSpringMVC2_5,勾选使用web.xml 。
注:自己使用 tomcat 7,默认的ROOT 目录中web.xml 中定义的wep-app版本是2.5,为排除干扰,就建一个2.5版本的web工程。
2、导入必须的8个 Spring 包。
通过后面发布工程时提示的错误看,必须的Spring 包有8个,为:aop、context、context-support、beans、core、expression、web、webmvc。
3、配置web.xml。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"
version="2.5">
<display-name>JWebSpringMVC2_5</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/DispatcherServlet-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
注:spring 中DispatcherServlet 类来管理servlet。参数名contextConfigLocation 是该类中定义的,不能改变,其值指定了我们的定义的servlet 的xml文件。
DispatcherServlet-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 定义映射 请求helloWorld.do时,转到id为helloWorldAction 的控制器中-->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="helloWorld.do">helloWorldAction</prop>
</props>
</property>
</bean>
<!-- 定义视图解析器,InternalResourceView表示使用JSP/Servlet技术 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.InternalResourceView</value>
</property>
</bean>
<!-- 定义多个控制器 此处定义了HelloWorldAction 一个控制器。指定控制器中的属性值-->
<bean id="helloWorldAction" class="com.milan.actions.HelloWorldAction">
<property name="helloWorld">
<value>HelloWorld</value>
</property>
<property name="viewPage">
<value>firstPage.jsp</value><!--定义该控制器中viewPage属性值为firstPage.jsp-->
</property>
</bean>
</beans>
包名:com.milan.actions,控制器名:HelloWorldAction,继承于:org.springframework.web.servlet.mvc.Controller
代码:
package com.milan.actions;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloWorldAction implements Controller{
private String hello;//xml中需指定该控制器的两个属性值
private String viewPage;
//实现Controller接口中的handleRequest方法
@Override
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
arg0.setAttribute("hello",getHelloWorld());//设置值,用于下一个页面显示
return new ModelAndView(getViewPage());
}
//依赖注入要返回的页面
public void setViewPage(String viewPage){
this.viewPage=viewPage;
}
//获取要返回的页面
public String getViewPage(){
return viewPage;
}
//依赖注入也显示在页面中的文字
public void setHelloWorld(String helloWorld){
this.helloWorld=helloWorld;
}
//获取要显示在页面中的文字
public String getHelloWorld(){
return helloWorld;
}
}
5、控制器所指向的firstPage.jsp。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FirstPage</title>
</head>
<body>
<% String str=(String)request.getAttribute("hello"); %>
<h1>这是第一页</h1>
<p>上个页面处理后传回的值为:<%=str %></p>
</body>
</html>
6、关键。将所用到的spring 包复制到tomcat 安装目录的 lib文件夹下(为什么不是发布项目所在lib,第二项解释)。
7、运行。结果:
结果:通过helloWorld.do 进入了控制器,并通过控制器在request 对象中设置了一个hello 属性,在返回的firstPage 页面中取回了该值。
注意到url 并没有变成 firstPage.jsp !
二、ClassNotFoundException错误及解决方法
下面的这些错误困扰了我整整两天!在网上搜了也没有一个方法能直接解决,所以必须在此记录和分析!
1、错误日志:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
严重: Servlet [springServlet] in web application [/JWebSpringMVC2_5] threw load()
exception
java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
原因分析:
1、拼写错误,切勿眼神不好,将DispatcherServlet 写出DsipatherServlet !当然可以Ctrl + 鼠标单击 查看是否找到源码(前提是jar包附上了源码)。
注:附jar包源码:jar文件上右键——>选择properties——>External File——>选择jar文件相应的源码。之后便可以查看jar中class的源码。
2、工程中导入了jar 包,但发布时没有eclipse不会自动复制该jar 包到发布目录,所以提示找不到类。
说明:
我的发布目录与eclipse 工作空间不是一个目录,我的发布目录设为tomcat 安装目录的web-apps 目录。
重要一点:缺少所依赖的jar 包,则无法发布成功,所以许多人说的将jar 包手动复制到发布项目文件夹的lib下(注意不是tomcat 目录的lib),自己尝试了根本不行,因为只有项目发布后才会有WEB-INF/lib 目录。且就算你发布失败了,再把jar 包放在该WEB-INF/lib 目录下,tomcat 也还是会提示相同错误,因为根本不会扫描该路径。
最终解决方法:
将所有依赖的jar 包放在tomcat 目录的lib 下。该lib 下放的是所有工程共享的jar 包。(这样据说有个缺点,每次启动tomcat 时都会扫描该目录,所以放的jar 包太多,需要更多时间,但谁会在乎这点呢?)
2、错误日志:信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
四月 19, 2017 11:40:38 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: The APR based Apache Tomcat Native library which allows optimal performance in
production environments was not found on the java.library.path
tomcat 运行需要依赖 java 的jvm.dll,如果是安装板tomcat, 确保设置tomcat所引用的的jvm 路径为正确路径。
3、错误日志:[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:JWebSpringMVCTest' did not find a matching property.
四月 19, 2017 12:46:16 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:JWebSpringMVC2_5' did not find a matching property.
与项目能否发布成功无直接关系,无需关注!
4、错误日志:java.lang.ClassNotFoundException 类错误
对Java SE 项目,一般应该是没有导入jar 包,或导入的jar 包不完整等导致的;
对Java EE项目,则应注意项目发布后,tomcat 能否引用到该jar 包,即该jar 包是否存在与tomcat 的lib 目录,或tomcat 能访问的其它目录(暂时还不知怎么配置)。
三、项目 clean
eclipse——>Project——clean.
1、项目clean 的作用?
清除前一次发布工程时产生的class 文件等等,且重新检查依赖关系。
2、什么时候需要clean?
新引入了jar 包,或提示各种问题时,都可以clean。如果项目已经发布到了服务器,则clean 时需要停止 服务器clean,此时会发现项目的状态为 republish,即重新发布,所以如果不clean,则只是在原来发布的基础上修补。
四、Deployment Assembly 发布装配
原文中的第2点: 解决Eclipse发布webproject, jar无法发布到tomcat lib目录下的问题
具体步骤:工程文件夹右击——>properties——>Deployment Assembly——>Add——>添加后确认——>之后便是在tomcat服务器上发布工程——>查看发布工程文件夹的lib。
第一步:配置工程中的文件及发布后的位置。
第二步:对Add的说明。点击Add,出现下面窗口,选择红线标记处,之后会出现工程所依赖的jar 包,可在上面窗口配置要发布的路径。
之后可在web-apps 目录的项目文件夹的WEB-INF/lib 下看到所添加的 jar 包。从而无需手动复制jar 包,解决ClassNotFound 问题。