主要记录下学习过程中遇到的问题,重点在第二项。
一、新建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:
JWebSpringMVC2_5
index.jsp
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
WEB-INF/DispatcherServlet-servlet.xml
DispatcherServlet
*.do
注:spring 中DispatcherServlet 类来管理servlet。参数名contextConfigLocation 是该类中定义的,不能改变,其值指定了我们的定义的servlet 的xml文件。
DispatcherServlet-servlet.xml:
helloWorldAction
org.springframework.web.servlet.view.InternalResourceView
HelloWorld
firstPage.jsp
代码:
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;
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
FirstPage
<% String str=(String)request.getAttribute("hello"); %>
这是第一页
上个页面处理后传回的值为:<%=str %>
结果:通过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 问题。