分类: 系统运维
2010-12-24 14:08:50
**注意:本篇文章是写给有web开发经验,对struts、hibernate、spring框架有初步了解的同志看的……
一、打开MyEclipse,新建一个web project,取名ssh
图一
二、拷贝struts、hibernate、spring的架包到/WEB-INF/lib目录下,没有jar包的可以到apache、hibernate、spring各自的官方去下载。我这里有一个配置好的,点击下载
**值得注意的是:jar包不要重复,如果有重复的,可以删除版本比较旧的,同时把相应的数据库驱动程序拷贝进去。
三、建立包结构,如下图
之所以要进行分包,道理我就不说了……
四、添加各自的配置文件。
(1)添加struts的配置文件struts-config.xml的到/WEB-INF/目录下,这里讲究一个技巧,不管是struts、hibernate还是spring也好,所有与它们相关的配置都可以参照架包中的事例进行配置
struts-config.xml内容当前只保留下面这些:
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"---------这里需要注意的是dtd的版本(就是说,你导入的是struts1.3的,但是你却用的是1.2的dtd,就可能出现错误)
"">
……
(2)添加hibernate的配置文件hibernate.cfg.xml到src目录下
hibernate.cfg.xml内容当前只保留下面这些:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"">
……
(3)添加log4j.properties到src目录下,关于log4j的配置,我这里就不多说了,同样可以参照hibernate的示例。
(4)拷贝spring示例中四份application.xml到src目录下,改名为:
applicationContext-action.xml
applicationContext-bean.xml
applicationContext-service.xml
applicationContext-dao.xml
以上四个文件的当前内容如下:
xmlns:xsi="" xmlns:aop="" xmlns:tx="" xsi:schemaLocation=" ">
……
(4)配置web.xml文件如下:
xmlns:xsi="" xsi:schemaLocation=" "> org.springframework.web.context.ContextLoaderListener classpath*:applicationContext-*.xml org.apache.struts.action.ActionServlet
下面我解释以下上面原配置:
对于方式一和方式二,是说让我们的web服务器一加载,能读取到spring的配置文件,
以上两种方式的区别在于,一个是通过servlet加载,另一个是通过listener来加载,不明白listener的建议再重新学习一下servlet就OK了。
关于以上红色部分:classpath*:applicationContext-*.xml
意思是让我们的web服务器到应用程序的classpath*目录下去寻找与applicationContext-*.xml的配置文件。注意我们这里用到了两个通配符,当然,你也可以把applicationContext-*.xml放到/WEB-INF/下,那么红色部分就改为以下内容:
/WEB-INF/applicationContext-*.xml
其它的是配置struts的,一看就明白,我就不多说了
(5)下面我们开始配置hiberante,打开上面的hibernate.cfg.xml
配置好的内容如下:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"">
jdbc:mysql://localhost:3306/ssh
com.mysql.jdbc.Driver
org.hibernate.dialect.MySQLDialect
明白jdbc的一看就能明白,我这里就不说了,需要强调的是:
它的意思是说,让hibernate能自动完成数据库的ddl,比如创建数据表
如果你用的是其它数据库,可以更改hibernate.dialect为相应的方言
(6)com.oristand.hibernate.pojo包下新建User.java类和User.hbm.xml文件
内容如下:
package com.oristand.hibernate.pojo;
public class User {
private int id;
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
这就是我们所说的pojo,pure old java object,纯粹的java对象
User.hbm.xml内容如下:
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
注意,这里的username和password一定要和User.java中的username,password相同
解释一下:
1.
2.
就是对应的主键和主键的生成策略了
3.
(7)再打开hibernate.cfg.xml文件添加下面红色部分内容:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"">
jdbc:mysql://localhost:3306/ssh
com.mysql.jdbc.Driver
org.hibernate.dialect.MySQLDialect
***********************到这里,相关的配置就告一段落***********
下面我们创建相关的业务逻辑类处理类
(1)com.oristand.service包下新建一个ILoginService接口,内容如下:
package com.oristand.service;
import com.oristand.hibernate.pojo.User;
public interface ILoginService {
public boolean login(User user);
}
(2)com.oristand.dao下新建实接口ILoginDAO,内容如下:
package com.oristand.dao;
import com.oristand.hibernate.pojo.User;
public interface ILoginDAO {
public boolean login(User user);
}
(3)分别在com.oristand.service.impl和com.oristand.dao.impl下新建以上两个接口的实现类LoginServiceImpl和LoginDAOImpl
LoginDAOImpl.java内容如下:
package com.oristand.dao.impl;
import com.oristand.hibernate.pojo.User;
public class LoginDAOImpl implements ILoginDAO {
public boolean login(User user) {
……
}
}
LoginServiceImpl.java内容如下:
package com.oristand.service.impl;
import com.oristand.dao.ILoginDAO;
import com.oristand.hibernate.pojo.User;
import com.oristand.service.ILoginService;
public class LoginServiceImpl implements ILoginService {
private ILoginDAO loginDAO;
public boolean login(User user) {
return this.loginDAO.login(user);
}
public void setLoginDAO(ILoginDAO loginDAO) {
this.loginDAO = loginDAO;
}
}
**注意,我们为什么要分层分的这么细,实际开发中也是这么做的,道理很简单,学过软件工程的人可能知道,我们软件开发,特别是面向对象的开发应该讲究高内聚、低偶合。
……部分的就是我们真正执行数据库查询时的操作,后面再说……
(3)新建一个类,这个类是与处理与Hibernate 相关的操作,所以我们取名为HibernateUtil.java
内容如下:
package com.oristand.hibernate.utils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class HibernateUtil {
private static Log log = LogFactory.getLog(HibernateUtil.class);
private static final SessionFactory sessionFactory;
static {
try {
Configuration cfg = new Configuration().configure();
SchemaExport schemaExport = new SchemaExport(cfg);
schemaExport.create(true, true);
sessionFactory = cfg.buildSessionFactory();
} catch (Throwable ex) {
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() {
Session session = null;
try {
session = sessionFactory.openSession();
} catch (HibernateException he) {
he.printStackTrace();
}
return session;
}
public static void closeSession(Session session) {
if (null != session) {
if (session.isOpen()) {
session.close();
}
}
}
}
注意:
SchemaExport schemaExport = new SchemaExport(cfg);
schemaExport.create(true, true);
这两行代码负责为我们生成前面所说的ddl语句,相当于下面的sql语句:
create table t_user(
uid int primary key auto_increment not null,
uname varchar(255),
upwd varchar(255),
);
(4)接着我们补全LoginDAOImpl.java中……部分的代码:
补全后如下:
package com.oristand.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.oristand.dao.ILoginDAO;
import com.oristand.hibernate.pojo.User;
import com.oristand.hibernate.utils.HibernateUtil;
public class LoginDAOImpl implements ILoginDAO {
public boolean login(User user) {
Session session = null;
Transaction tr = null;
String hql = " from User u where u.username='" + user.getUsername()
+ "' and u.password= '" + user.getPassword() + "'";
List list = null;
try {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
Query query = session.createQuery(hql);
list = query.list();
tr.commit();
} catch (Exception e) {
e.printStackTrace();
tr.rollback();
} finally {
HibernateUtil.closeSession(session);
}
return list.size()==0 ? false : true;
}
}
注意划红线的User,这里的User,不是数据库表t_user,而是com.oristand.hibernate.pojo.User
它是一个持久化的对象,关于Hibernate的持久化,请参阅相关的资料。
(5)com.oristand.struts.form包下新建LoginForm.java,它继承自struts的ActionForm,LoginForm.java内容如下:
package com.oristand.struts.forms;
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm {
private static final long serialVersionUID = -7348709568990046558L;
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
(6)com.oristand.struts.action下新建LoginAction.java,它继承自struts的Action,LoginAction.java内容如下:
package com.oristand.struts.actions;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import com.oristand.hibernate.pojo.User;
import com.oristand.service.ILoginService;
import com.oristand.struts.forms.LoginForm;
public class LoginAction extends Action {
private User loginUser;
private ILoginService loginService;
public void setLoginService(ILoginService loginService) {
this.loginService = loginService;
}
public void setLoginUser(User loginUser) {
this.loginUser = loginUser;
}
@Override
public ActionForward execute(ActionMapping arg0, ActionForm arg1,
HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
LoginForm loginForm = (LoginForm) arg1;
String username = loginForm.getUsername();
String password = loginForm.getPassword();
loginUser.setUsername(username);
loginUser.setPassword(password);
ActionMessages messages = new ActionMessages();
if (!loginService.login(loginUser)) {
ActionMessage error1 = new ActionMessage(
"user.error", username);
messages.add("error1", error1);
this.saveErrors(arg2, messages);
} else {
ActionMessage successMessage = new ActionMessage(
"user.login.success");
messages.add("loginSuccess", successMessage);
this.saveMessages(arg2, messages);
return arg0.findForward("success");
}
return arg0.findForward("error");
}
}
注意:红色代码内,涉及到struts的国际化相关知识,所以说,我们这篇文章是给有struts相关经验的同志准备的……其它struts的国际化相当简单。
(7)com.oristand.struts.action下再建一个ChangLangAction.java
内容如下:
package com.oristand.struts.actions;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class ChangeLangAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String lang=request.getParameter("lang");
Locale locale=Locale.getDefault();
if("zh".equals(lang)){
locale=new Locale("zh","CN");
}else if("en".equals(lang)){
locale=new Locale("en","US");
}
this.setLocale(request, locale);
return mapping.findForward("login");
}
}
(8)配置struts-config.xml文件
配置内容如下:
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"">
type="com.oristand.struts.forms.LoginForm" /> type="org.springframework.web.struts.DelegatingActionProxy"> type="com.oristand.struts.actions.ChangeLangAction"> (9)src目录下新建resources目录,resourcess目录下新建MessageResource_zh_CN.properties和MessageResource_en_US.properties文件,这就是国际化的资源文件 MessageResource_zh_CN.properties内容如下: #messages user.lable.username=\u7528\u6237\u540d user.lable.password=\u5bc6\u7801 user.button.login=\u63d0\u4ea4 lang.en=\u82f1\u6587 user.error=\u7528\u6237\u540d\u6216\u8005\u5bc6\u7801\u51fa\u9519 user.username.error=\u7528\u6237\u540d{0}\u4e0d\u6b63\u786e user.password.error=\u5bc6\u7801{0}\u4e0d\u6b63\u786e user.lable.username=UserName user.lable.password=Password user.button.login=Submit lang.zh=\u4e2d\u6587 lang.en=English user.error=username or password is not right user.username.error=username is not right user.password.error=password is not right (10)WebRoot目录下新建index.jsp,login.jsp,error.jsp,success.jsp测试页面,内容如下: index.jsp: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> < prefix="bean" uri="" %>
lang.zh=\u4e2d\u6587
user.login.success=\u767b\u5f55\u6210\u529f
#errors
MessageResource_en_US.properties内容如下:
user.login.success=login success
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
< prefix="bean" uri="" %>
error.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
< prefix="html" uri=">
< prefix="bean" uri=">
success.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
< prefix="html" uri=">
< prefix="bean" uri=">
(11)测试,部署到tomcat。
向ssh数据库中添加一条记录:
insert into t_user(uname,upwd) values('admin','admin');
浏览器中输入就可以测试了
************************结束***************************