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:

<?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>


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"%>
<!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 问题。














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值