Spring笔记——第一个SpringMVC 工程

主要记录下学习过程中遇到的问题,重点在第二项。


一、新建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
		
	


4、编写控制器,控制跳转到到哪个页面。
包名: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"%>




FirstPage


<% String str=(String)request.getAttribute("hello"); %>
	

这是第一页

上个页面处理后传回的值为:<%=str %>


6、关键。将所用到的spring 包复制到tomcat 安装目录的 lib文件夹下(为什么不是发布项目所在lib,第二项解释)。
7、运行。结果:

Spring笔记——第一个SpringMVC 工程_第1张图片

结果:通过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。

第一步:配置工程中的文件及发布后的位置。

Spring笔记——第一个SpringMVC 工程_第2张图片


第二步:对Add的说明。点击Add,出现下面窗口,选择红线标记处,之后会出现工程所依赖的jar 包,可在上面窗口配置要发布的路径。

Spring笔记——第一个SpringMVC 工程_第3张图片


之后可在web-apps 目录的项目文件夹的WEB-INF/lib 下看到所添加的 jar 包。从而无需手动复制jar 包,解决ClassNotFound 问题。














你可能感兴趣的:(Spring)