Chinaunix首页 | 论坛 | 博客
  • 博客访问: 925077
  • 博文数量: 264
  • 博客积分: 10107
  • 博客等级: 上将
  • 技术积分: 2455
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-09 16:34
文章分类

全部博文(264)

文章存档

2012年(1)

2011年(11)

2010年(128)

2009年(82)

2008年(42)

我的朋友

分类: 系统运维

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

contextConfigLocation

classpath*:applicationContext-*.xml

action

org.apache.struts.action.ActionServlet

config

/WEB-INF/struts-config.xml

2


action

*.do


下面我解释以下上面原配置:

对于方式一和方式二,是说让我们的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

root

123456

org.hibernate.dialect.MySQLDialect

true

update

明白jdbc的一看就能明白,我这里就不说了,需要强调的是:

update

它的意思是说,让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.是说把User这个类,映射到t_user数据表中

2.

就是对应的主键和主键的生成策略了

3.就是username映射成的t_user表中的uname字段


(7)再打开hibernate.cfg.xml文件添加下面红色部分内容:

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"">


jdbc:mysql://localhost:3306/ssh

com.mysql.jdbc.Driver

root

123456

org.hibernate.dialect.MySQLDialect

true

update

***********************到这里,相关的配置就告一段落***********

下面我们创建相关的业务逻辑类处理类

(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.zh=\u4e2d\u6587

lang.en=\u82f1\u6587


user.login.success=\u767b\u5f55\u6210\u529f


#errors

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


MessageResource_en_US.properties内容如下:

user.lable.username=UserName

user.lable.password=Password

user.button.login=Submit

lang.zh=\u4e2d\u6587

lang.en=English


user.login.success=login success

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="" %>


My JSP 'index.jsp' starting page




 


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="" %>



My JSP 'login.jsp' starting page




:


:


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=">


My JSP 'success.jsp' starting page




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=">


My JSP 'success.jsp' starting page




(11)测试,部署到tomcat。

向ssh数据库中添加一条记录:

insert into t_user(uname,upwd) values('admin','admin');

浏览器中输入就可以测试了


************************结束***************************

 

阅读(1008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~