SSH配置详细步骤及异常处理
该文章详细介绍了SSH的配置步骤与工程代码。
配置步骤见:http://blog.csdn.net/sipsir/archive/2009/10/23/4721526.aspx
代码下载:http://sipsir.download.csdn.net/
本文word格式:http://download.csdn.net/source/1764763
1 环境介绍
Jdk:1.5s
服务器:tomcat5.5
开发工具:myeclipse 6.5 ga
数据库工具:oracle 10g(确定有class12.jar或带有oracle驱动的jar包)
开发技术:Spring2.0,struts1.3,hibernate3.1,jsp
好了,进行SSH的开发。
2 新建web project
新建web项目(使用j2ee 5.0),项目名称为guestbook2,如图:
clip_image002
(图一)
第二步:为项目创建一个文件夹lib(用来将来存放相应的jar包,在添加相应的SSH支持后,要把lib里面的jar通过configure build-path—add jar的方式将其加入),
--可以采用系统默认的lib库位置,目录为WebRoot/WEB-INF/lib(Add by Michael)
如图:
clip_image004
(图二)
3 配置MyEclipse数据库(Add by Michael)
打开Hibernate视图
clip_image006
new一个
clip_image008
配置数据库,其中要手动指定Class12.jar的目录,如下图
clip_image010
4 添加hibernate支持
第1步:为项目添加hibernate 支持,如图:
clip_image012
(图三)
如下图,我们添加hibernate3.1的核心库而且采用:copy checked library jars to project folder and add to build-path 的方式把包添加至我们刚刚新建的lib文件夹处。完成后,点击”next”.
hibe
clip_image014
接着,他会询问是否创建hibernate的配置文件:hibernate.cfg.xml,我们不需要发动,直接点”next”。
clip_image016
我们需要配置项目中要应用的数据库的配置信息:
clip_image018
在上图中,我使用了名为DB Driver 为Linkoracle10g的连接方式(可使用myeclipse的myeclipse database explorer方式来创建与oracle10g的连接),相应地,myeclipse会使项目具有与oracle数据库连接的能力了。
接着点”next”,会看见如下图:
clip_image020
默认是挑选了“create SessionFactory class”的,在这里,它想为我们创建一个sessionfactory的类,但我们不创建sessionfactory,因为我将来使用spring来完成这步操作,使用spring ,可以帮助我们可以生成一个能获得hibernate session对象的一个类。
点击”finish”完成的hibernate的支持。
5 添加Spring支持
第1步:为项目添加Spring 支持,如图:
clip_image022
在这里,我使用spring2.0的支持,把相应的四个选项选中:
clip_image024
第四个为:
clip_image025
--选择了spring2.0,如何选择sping2.5的jar?实际情况是我没有选择spring2.5也能完成这个测试(Add by Michael)
而且,我们采用:copy checked library jars to project folder and add to build-path 的方式把包添加至我们刚刚新建的lib文件夹处。完成后,如图:
clip_image027
完成后,点击”next”.会看到如下图:(Myeclipse会为我们创建spring的配置文件,我们确定创建)
clip_image029
点击”next”.进入下一步。这时会看到,如图:
clip_image031
在上图中,他会创建一个能获得hibernate session 对象的一个sessionFactory 类型的对象,他被设置在了applicationContext.xml文件中。
点击“finish”,完成Spring 的支持了。
备注:打开applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
</beans>
在这里,我们发现设置了一个id为sessionFactory类型的一个对象,他的类型是 org.springframework.orm.hibernate3.LocalSessionFactoryBean,当中还有属性configLocation,value="classpath:hibernate.cfg.xml,这些配置信息呢。实际上可以这样理解:
设定了一个id为sessionFactory 类型的对象,它的类型是:org.springframework.orm.hibernate3.LocalSessionFactoryBean的,通过这个对象就能获取hibernate 的session 对象,进行完成对数据的添加、删除、修改的操作。也就是说这个对象是spring 帮我们提供的一个支持.
6 开发持久层的这些类和接口
6.1 oracle表SQL
增加了hibernate ,spring的支持后,我们就可以开发持久层的这些类和接口了。首先,我们的项目要用到了guestbook、admin两个表,所以要使用oracle来创建这两个表,表的创建的sql提供给大家,如下所示:
create table ADMIN
(
ID NUMBER not null,
USERNAME VARCHAR2(20),
PASSWORD VARCHAR2(20)
);
alter table ADMIN add constraint ADMIN_PK primary key (ID);
create table GUESTBOOK
(
ID NUMBER not null,
NAME VARCHAR2(40),
EMAIL VARCHAR2(60),
URL VARCHAR2(60),
TITLE VARCHAR2(200),
CONTENT VARCHAR2(2000),
TIME VARCHAR2(40)
);
alter table GUESTBOOK add constraint GBOOK_PK primary key (ID);
insert into ADMIN (ID, USERNAME, PASSWORD)
values (1, 'liuwei', '123456');
commit;
insert into GUESTBOOK (ID, NAME, EMAIL, URL, TITLE, CONTENT, TIME)
values (100026, '刘伟', 'liuwei8809@163.com', 'http://www.v512.com', '欢迎大家观看我的视频', '感谢大家对我们的支持,请持续关注我们的网站。更多内容,更多视频,尽在www.v512.com。', '2007-16-14 02:12:51');
insert into GUESTBOOK (ID, NAME, EMAIL, URL, TITLE, CONTENT, TIME)
values (1000072, '开发工具与软件', null, 'http://news.sina.com.cn', '我们爱大家', '开发工具与软件开发工具与软件开发工具与软件开发工具与软件,我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家。', '2007-42-20 01:12:17');
insert into GUESTBOOK (ID, NAME, EMAIL, URL, TITLE, CONTENT, TIME)
values (1000074, '开发工具与软件', 'liuwei@v512.com', 'http://news.sina.com.cn', '我们爱大家', '开发工具与软件开发工具与软件开发工具与软件开发工具与软件,我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家我们爱大家。', '2007-50-20 02:12:52');
commit;
而且还应该在oracle10g中创建名为gb_seq的序列,sql语句为:(有问题,在哪里创建sequence的?)
我只用了一个创建sequence的SQL,如下:
create sequence GB_SEQ
minvalue 1
maxvalue 99999999
start with 1
increment by 1
cache 20;
以下是原作者关于sequence的sql,我都没有使用因为不知道在哪里create。
-- Alter sequence
alter sequence gb_seq
nominvalue
nomaxvalue
nocache;
-- Modify the last number
alter sequence gb_seq increment by -20 nocache;
select gb_seq.nextval from dual;
alter sequence gb_seq increment by 1 nocache;
declare
LastValue integer;
begin
loop
select gb_seq.currval into LastValue from dual;
exit when LastValue >= 100000 - 1;
select gb_seq.nextval into LastValue from dual;
end loop;
end;
/
alter sequence gb_seq increment by 1 nocache;
(备注:在创建数据库的表时,我是使用了PLSQLDeveloper工具来创建的,这样更方便快捷些,要使用这个工具,请自行下载。)
好了,接着做下去。
6.2 生成Admin,guestbook表model
首先,我们打开myeclipse database explorer 视图,在这里,我们进行逆向工程的操作,如图:
clip_image033
这样就打开了逆向工程的操作的界面了。
接着,我们会看到如下的操作界面,如图:
clip_image035
使用如上图的设置,com.v512.guestbook.model存放的是映射文件和相应的实体类(POJO),再点击”next”.
这时,会出现操作界面,如下图:
clip_image037
在这一步,他设置了主键的生成方式,我使用了native,其它不用改变。最后点击”finish”.
同理,添加guestbook表。(add by Michael)
再查看目录结构,会显示如下的目录结构,如图:
clip_image039
里面针对两个表生成了相应的.hbm.xml的映射文件和相应的两个类。查看hibernate.cfg.xml,其源码如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">scott</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:ora10g
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="myeclipse.connection.profile">
Linkoracle10g
</property>
<property name="connection.password">tiger</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<mapping resource="com/v512/guestbook/model/Admin.hbm.xml" />
<mapping resource="com/v512/guestbook/model/Guestbook.hbm.xml" />
</session-factory>
</hibernate-configuration>
执行上面的操作后,接着往下做。呵呵。
6.3 数据库接口
6.3.1 GuestbookDao接口
我们为项目新建一个包,包名称为:com.v512.guestbook.dao,它用来存放对底层数据库进行的操作的一系列接口。接着在包中新建一个接口,名为:GuestbookDao,如图:
clip_image041
在接口中,我们定义了几个方法,如下:
package com.v512.guestbook.dao;
import java.util.*;
import com.v512.guestbook.model.Guestbook;
//DAO指的是能对底层数据训进行怎样的操作,通常是增删改查的操作
public interface GuestbookDao {
public void save(Guestbook g);
public void delete(Long id);
public List getGuestbooks();
public Guestbook getGuestbook(Long id);
}
6.3.2 GuestbookDao接口的实现类GuestbookDaoHibernate
紧接着我们创建一个包,包名为:com.v512.guestbook.dao.hibernate,这个包存放的是实现了上面定义的dao接口的类,而这些类当中都是通过使用Hibernate 的技术来执行相应的操作的。
在该包中,我创建了一个类,类的名称为:GuestbookDaoHibernate,它要实现上面定义的GuestbookDao接口,并且继承于HibernateDaoSupport.类的完整的源码是:
package com.v512.guestbook.dao.hibernate;
//这个包存放的实现了dao接口的一些类,而这些类都是通过Hibernate的技术来执行相应的操作
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.v512.guestbook.dao.GuestbookDao;
import com.v512.guestbook.model.Guestbook;
public class GuestbookDaoHibernate extends HibernateDaoSupport implements GuestbookDao {
public void delete(Long id) {
this.getHibernateTemplate().delete(getGuestbook(id));
}
public Guestbook getGuestbook(Long id) {
return (Guestbook)getHibernateTemplate().get(com.v512.guestbook.model.Guestbook.class, id);
}
public List getGuestbooks() {
return getHibernateTemplate().find("from Guestbook order by id desc");
}
public void save(Guestbook g) {
getHibernateTemplate().saveOrUpdate(g);
}
}
6.3.3 GuestbookManager接口
在上面操作完成后,我们开始编写服务层的接口和相应的接口实现类(可以理解为spring层)。
我们新建一个包,包的名称为com.v512.guestbook.service,接着我们在该包中定义了一个接口。完整的源如下:
package com.v512.guestbook.service;
import java.util.List;
import com.v512.guestbook.model.Guestbook;
public interface GuestbookManager {
public void save(Guestbook g);
public void delete(String id);
public Guestbook getGuestbook(String id);
public List getGuestbooks();
}
6.3.4 GuestbookManager接口的实现类GuestbookManagerImpl
到了这里,我们新建一个包,包名称为:com.v512.guestbook.service.impl,在包中,我定义了上面GuestbookManager的实现类,完整的源码如下:
package com.v512.guestbook.service.impl;
import java.util.List;
import com.v512.guestbook.dao.GuestbookDao;
import com.v512.guestbook.model.Guestbook;
import com.v512.guestbook.service.GuestbookManager;
public class GuestbookManagerImpl implements GuestbookManager {
private GuestbookDao dao;
public void setGuestbookDao(GuestbookDao dao) {
this.dao = dao;
}
public void delete(String id) {
dao.delete(new Long(id));
}
public Guestbook getGuestbook(String id) {
return dao.getGuestbook(new Long(id));
}
public List getGuestbooks() {
return dao.getGuestbooks();
}
public void save(Guestbook g) {
dao.save(g);
}
}
6.3.5 AdminDao接口
执行类似的操作,我们在com.v512.guestbook.dao中定义AdminDao的接口,代码如下:
package com.v512.guestbook.dao;
public interface AdminDao {
public boolean validate(String username,String password);
}
6.3.6 AdminDao接口的实现类AdminDaoHibernate
再创建AdminDao的实现类,类名称为AdminDaoHibernate,把它放置在com.v512.guestbook.dao.hibernate包中,完整的源码是:
package com.v512.guestbook.dao.hibernate;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.v512.guestbook.dao.AdminDao;
public class AdminDaoHibernate extends HibernateDaoSupport implements AdminDao {
public boolean validate(String username, String password) {
String param[]={username,password};
List list =getHibernateTemplate().find("from Admin where username=? and password=?",param);
return list.size()>0;
}
}
在上面操作完成后,我们开始编写服务层的接口和相应的接口实现类(可以理解为spring层)。
6.3.7 AdminManager接口
我们新建一个包,包的名称为com.v512.guestbook.service,接着我们在该包中定义了一个接口。完整的源如下:
package com.v512.guestbook.service;
public interface AdminManager{
public boolean validate(String username,String password);
}
6.3.8 AdminManager接口的实现类
到了这里,我们新建一个包,包名称为:com.v512.guestbook.service.impl,在包中,我定义了上面AdminManager的实现类,完整的源码如下:
package com.v512.guestbook.service.impl;
import com.v512.guestbook.dao.AdminDao;
import com.v512.guestbook.service.AdminManager;
public class AdminManagerImpl implements AdminManager {
private AdminDao dao;
public void setAdminDao(AdminDao dao){
this.dao=dao;
}
public boolean validate(String username, String password) {
return dao.validate(username, password);
}
}
6.4 在spring的配置文件配置数据源,舍弃hibernate.cfg.xml
紧接着,我们在执行完上面的操作后,我们去修改项目当中的配置文件。在applicationContext.xml中,我想把Hibernate 的配置信息也设置到applicationContext.xml 文件中去,这样的话,hibernate.cfg.xml文件就不需要了.
首先,打开applicationContext.xml,右键,我在当中创建一个dataSource的bean,如图:
clip_image043
接着会弹出这样一个操作界面,如图:
clip_image045
设置后,applicationContext.xml中便新增了名为dataSourece的bean。如图:
clip_image047
注意:这里会提示错误,因为project里没有commons-dbcp.jar把导致。到D:/MyEclipse 6.5/myeclipse/eclipse/plugins 的目录下搜索, copy到project lib目录下,再加到project的build path(add by Michael)
在增加了DataSource bean的设置后,再增加两个bean的设置,右键,在“Spring”---"New Bean" ,我们添加了guestbookDao和guestbookManager 两个bean,如图,
clip_image049
在上图中,要注意三点:
1)Bean id 指的是bean 的id;
2)Bean class :选择
clip_image051的”Browse”按钮,选择GuestbookDaoHibernate.
3)最重要的就是:Properties
clip_image053
在上图,表示guestbookDao要依赖注射一个sessionFactory的一个对象,添加玩后,如下图
clip_image055
(guestbookManager, adminDao, adminManager的添加与上类同,不再赘述。同理他也依赖于guestbookManager 依赖于(ref) guestbookDao;
adminDao 依赖于(ref) sessionFactory;
adminManager 依赖于(ref) adminDao;)。(add by Michael)
现在呢,我们想不再使用Hibernat.cfg.xml文件 ,这里,要修改一下这个applicationContext.xml文件。完整的applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- 设定了一个id为sessionFactory 类型的对象,它的类型是:org.springframework.orm.hibernate3.LocalSessionFactoryBean的,通过这个对象就能获取hibernate 的session 对象,进行完成对数据的添加、删除、修改的操作。也就是说这个对象是spring 帮我们提供的一个支持. -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- <property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
-->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/v512/guestbook/model/Admin.hbm.xml</value>
<value>
com/v512/guestbook/model/Guestbook.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:ora10g">
</property>
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
<!-- guestbookDao bean -->
<bean id="guestbookDao"
class="com.v512.guestbook.dao.hibernate.GuestbookDaoHibernate"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="sessionFactory"><!-- 表示guestbookDao要依赖注射一个sessionFactory的一个对象 -->
<ref bean="sessionFactory" />
</property>
</bean>
<!-- guestbookManager bean -->
<bean id="guestbookManager"
class="com.v512.guestbook.service.impl.GuestbookManagerImpl"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="guestbookDao"><!--表示guestbookManager需要一个DAO的支持,这里我注射一个guestbookDao -->
<ref bean="guestbookDao" />
</property>
</bean>
<bean id="adminDao"
class="com.v512.guestbook.dao.hibernate.AdminDaoHibernate"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="adminManager"
class="com.v512.guestbook.service.impl.AdminManagerImpl"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="adminDao">
<ref bean="adminDao" />
</property>
</bean>
</beans>
好了,我们现在应用的持久和服务层的实现类都编写好了,就到了web的开发了。
现在做2件事:(add by Michael)
1. src下的hibernate.cfg.xml要删除。
2. 把src的applicationContext.xml移到WebRoot/WEB-INF下,否则启动服务器时会报错找不到配置文件。
7 添加struts支持
为项目添加struts1.3的支持。包名为com.v512.guestbook.web,如图:
clip_image057
这时,项目结构发生了改变,如下图:
clip_image059
最后,我们修改配置文件,把struts和spring 结合起来。
修改配置文件web.xml文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- spring 提供了一个过滤器,我们直接拿来用 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<!-- 指定使用UTF-8 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 指对所有进行过滤,要加过滤映射,告诉他哪些文件要过滤-->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 下面的代码为了在web中使用spring,还要加载spring 的配置文件,所以要指定application.xml文件的位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value> <!-- 在这里,指定applicationContext.xml文件的路径,因此呆会要把applicationContext.xml剪切至/WEB-INF目录下 -->
</context-param>
<!-- 为了让web应用能加载spring,设置一个侦听,通过这样一个监听器,一启动WEB应用它自动根据上面设置好的配置文件的位置把配置文件加载到内存中,为进一步使用spring中的bean做好准备 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>input.jsp</welcome-file>
</welcome-file-list>
</web-app>
紧接着,struts-config.xml中我们要创建相应的Form,action,jsp页面,创建方式如图:
clip_image061
在此之后,详细的请参见所提供的源码的struts-config.xml文件,通过这个方式,就创建了相应的action,form,在完成这些操作后,SSH的配置就完成了。
(注:读者如果觉得看不懂的话,可以依照着源码重新做一次,文档写的不是很详细)
最后部署项目至tomcat容器下,就能够通过这个地址访问了:
http://localhost:8080/guestbook2/ .
原作者说到此结束,如果对于一个新手来说要把这个project运行起来可以还会有不少的困难。
8 运行project
8.1 copy相关文件到project
JSP文件:admin.jsp,display.jsp,edit.jsp,index.jsp,input.jsp,login.jsp,loginfail.jsp到WebRoot。
目录:css,images到WebRoot。
配置文件: action-servlet.xml,spring.tld,spring-form.tld,validations.xml到WebRoot/WEB-INF。
8.2 配置tomcat的log4j
目的是跟踪可能出现的异常,实践证明log能够快速的发现问题。另外很多新手的确也出现很多的问题,也包括我。
1. commons-logging-1.0.4.jar,log4j-1.2.11.jar copy到project的lib下。
2. 在Project的WebRoot下建目录logs。
clip_image063
3. 在src下新建log4j.properties文件,内容如下
log4j.rootLogger=info,Console,R
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.Console.layout.ConversionPattern=%d{yy-MM-dd HH/:mm/:ss} %5p %c{1}/:%L - %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D://Tomcat5.5// logs//tomcat.txt
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH/:mm/:ss} %5p %c{1}(%L)/:? %m%n
log4j.logger.org.apache=info, R
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R
log4j.logger.org.apache.catalina.core=info, R
log4j.logger.org.apache.catalina.session=info, R
log4j.appender.R.File要修改成你的log目录。
8.3 配置tomcat
Windows->preference
clip_image065
8.4 Deploy project
点击Deploy按钮,如下图
clip_image067
clip_image069
clip_image071
clip_image073
8.5 运行服务器tomcat
clip_image075
在你的IE里输入http://localhost:8080/guestbook2/。
此时如果你认为已经结束就太乐观了,大问题在后头呢。我第一次运行时被Error listenerStart搞的晕头。
9 服务器异常处理
9.1 服务器启动异常1
现象:
09-10-23 21:07:10 ERROR [/guestbook]:667 - action: null
java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1352)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
解决:
到D:/MyEclipse 6.5/myeclipse搜索spring-web.jar,加到project的lib下.重新部署Redeploy,再启动。
又遇到了下面的异常。
9.2 服务器启动异常2
现象:
2009.10.23 21:22:47 ERROR [/guestbook2](3678):? Error configuring application listener of class com.sun.faces.config.ConfigureListener
java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet
at java.lang.Class.getDeclaredConstructors0(Native Method)
解决:
到D:/MyEclipse 6.5/myeclipse搜索commons-pool.jar,jsf-impl,加到project的lib下.重新部署Redeploy,再启动。
至此,问题已经解决。
9.3 可能的其他异常供参考(从网上找的)
9.3.1 JSF--整合spring
使用JSF-Spring整合
一、下载
进官方网站http://jsf-spring.sourceforge.net,下载lib
二、参考quickstart配置相应文件
http://jsf-spring.sourceforge.net/quickstart.shtml
最终配置结果如下
web.xml
clip_image076<?xml version="1.0" encoding="UTF-8"?>
clip_image076[1]<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
clip_image076[2] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
clip_image076[3] xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
clip_image076[4] <context-param>
clip_image076[5] <param-name>javax.faces.CONFIG_FILES</param-name>
clip_image076[6] <param-value>
clip_image076[7] /WEB-INF/classes/faces/faces-config.xml,
clip_image076[8] /WEB-INF/classes/faces/faces-config-beans.xml
clip_image076[9] </param-value>
clip_image076[10] </context-param>
clip_image076[11] <context-param>
clip_image076[12] <param-name>contextConfigLocation</param-name>
clip_image076[13] <param-value>
clip_image076[14] classpath*:spring/applicationContext-*.xml
clip_image076[15] </param-value>
clip_image076[16] </context-param>
clip_image076[17]
clip_image076[18] <servlet>
clip_image076[19] <servlet-name>Faces Servlet</servlet-name>
clip_image076[20] <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
clip_image076[21] <load-on-startup>0</load-on-startup>
clip_image076[22] </servlet>
clip_image076[23] <servlet-mapping>
clip_image076[24] <servlet-name>Faces Servlet</servlet-name>
clip_image076[25] <url-pattern>*.faces</url-pattern>
clip_image076[26] </servlet-mapping>
clip_image076[27] <listener>
clip_image076[28] <listener-class>
clip_image076[29] org.springframework.web.context.request.RequestContextListener
clip_image076[30] </listener-class>
clip_image076[31] </listener>
clip_image076[32] <listener>
clip_image076[33] <listener-class>
clip_image076[34] org.springframework.web.context.ContextLoaderListener
clip_image076[35] </listener-class>
clip_image076[36] </listener>
clip_image076[37] <listener>
clip_image076[38] <listener-class>de.mindmatters.faces.spring.context.ContextLoaderListener</listener-class>
clip_image076[39] </listener>
clip_image076[40]
clip_image076[41]</web-app>
clip_image076[42]
clip_image076[43]
请注意以上listener的顺序,如果位置不同可能出现找不到在spring中定义的bean。请按以上顺序配置即可。
根据quitstart配置完之后可能还有如下异常:
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.faces.el.EvaluationException: de.mindmatters.faces.spring.factory.BeansEvaluationException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uiBean': Scope 'request' is not active; nested exception is java.lang.IllegalStateException: No thread-bound request: use RequestContextFilter
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:532)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:408)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:147)
de.mindmatters.faces.lifecycle.RenderResponsePhase.executePhase(RenderResponsePhase.java:45)
de.mindmatters.faces.lifecycle.AbstractPhase.execute(AbstractPhase.java:37)
de.mindmatters.faces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:166)
de.mindmatters.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:226)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
然后再把这个listener加上
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
就ok了。
可选
如果还有问题,在faces-config.xml中添加
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
SSH配置详细步骤及异常处理
最新推荐文章于 2023-05-06 14:25:42 发布