编写一个基本的ssh例子(2)

上一篇已经搭建了一个最基本的ssh开发环境。也能基本运行了,但是没有写实际的代码,只是把环境给配置好了。这次我们来写一个简单的例子,这个例子是参考网上的一个工程,本人也是菜鸟,哈哈

 完整的工程目录如下:



首先我们创建好Userinfo.java  , BaseDao.java , UserManagerService.java还有UserManagerAct.java这三个文件。并放到相应的包里面去分别是org.ssh.pojo,org.ssh.dao,org.ssh.service,org.ssh.action。如上图所示;下面逐一分析这个几个类

1.Userinfo.java 这是一个pojo类,也就是实体类。先看看代码先

 

package org.ssh.pojo;

/**
 * 用户信息
 */
public class Userinfo implements java.io.Serializable {

	private static final long serialVersionUID = 5866268712137826050L;
	/**用户id*/
	private Integer id;
	/**用户名*/
	private String uname;
	/**性别*/
	private String sex;
	/**密码*/
	private String password;
	/**电话号码*/
	private String telphone;
	/**住址*/
	private String address;

	public Userinfo() {
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUname() {
		return this.uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getSex() {
		return this.sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getTelphone() {
		return this.telphone;
	}

	public void setTelphone(String telphone) {
		this.telphone = telphone;
	}

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}
这个类主要是用来描述一个实体对象,跟数据库的用户表产生映射关系,所以我们还要在UserInfo.java的同级目录下创建一个hibernate的描述文件Userinfo.hbm.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.ssh.pojo.Userinfo" table="userinfo" catalog="myssh">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="assigned"></generator>
        </id>
        <property name="uname" type="java.lang.String">
            <column name="uname" length="30" not-null="true" unique="true"/>
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" length="10" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="20" not-null="true" />
        </property>
        <property name="telphone" type="java.lang.String">
            <column name="telphone" length="15" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="address" length="50" />
        </property>
    </class>
</hibernate-mapping>
这个内容应该不难理解,其实就是描述一下这个类关联数据库的那个表,那个属性关联哪一列,数据类型是什么...,这里不详细研究了,下次用注解就不用这个文件了。


2.BaseDao.java 这个类主要实现数据库的操作,这里只是一些简单的实现。上代码

package org.ssh.dao;

import java.io.Serializable;
import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 数据库io操作
 */
public class BaseDao extends HibernateDaoSupport {
	
	/**查询*/
	public <T> List<T> getObjects(String queryString){
		return (List<T>)this.getHibernateTemplate().find(queryString);
	}
	
	/**查询所有*/
	public <T> List<T> getAllObjects(Class<T> clazz){
		return this.getHibernateTemplate().loadAll(clazz);
	}
	
	/**添加一个*/
	public <T> void addObject(T clazz){
		this.getHibernateTemplate().save(clazz);
	}
	
	/**更新指定的*/
	public <T> void updateObject(T clazz){
		this.getHibernateTemplate().update(clazz);
	}

	/**删除指定的*/
	public <T> void deleteObject(T clazz){
		this.getHibernateTemplate().delete(clazz);
	}
	
	/**通过id获取*/
	public <T> T getObject(Class<T> clazz,Serializable id){
		return this.getHibernateTemplate().get(clazz, id);
	}
}

 

 

 

 

 

 3.UserManagerService.java 用户管理业务逻辑的实现,这个是业务逻辑层,业务逻辑在这里实现,这里操作数据库是调用上一层dao层代码。上代码 

package org.ssh.service;

import java.util.List;

import org.ssh.dao.BaseDao;
/**
 * 用户管理业务逻辑的实现
 * */
public class UserManagerService<T> {
	
	private BaseDao dao;
	
	public T doLogin(String userName,String password) throws Exception{
		if(userName == null || password == null) return null;
		String queryString = "SELECT u FROM Userinfo u WHERE u.uname = '"+userName +"' AND u.password = "+password;
		List<T> users = dao.getObjects(queryString);
		return users.get(0);
	}
	
	public List<T> queryUsers(String uname,Class<T> clazz){
		if(uname == null || "".equals(uname))
			return dao.getAllObjects(clazz);
		String queryString = "SELECT u FROM Userinfo u WHERE u.uname like '"+uname+"%'";
		return dao.getObjects(queryString);
	}
	
	public void addUser(T user) throws Exception{
		dao.addObject(user);
	}
	
	public void modifyUser(T user) throws Exception{
		dao.updateObject(user);
	}
	
	public void deleteUser(int id,Class<T> clazz) throws Exception{
		T u = dao.getObject(clazz, id);
		dao.deleteObject(u);
	}
	
	public T getUser(Class<T> clazz, int id){
		return dao.getObject(clazz, id);
	}
	
	public BaseDao getDao() {
		return dao;
	}

	public void setDao(BaseDao dao) {
		this.dao = dao;
	}
}


 

4.UserManagerAct.java 这是一个action,充当视图控制器的角色,也就是mvc中的c。直接与外部打交道,可以供客户端调用,也可以和jsp等调用,这一层通过调用业务逻辑层来完成功能。不直接操作数据库,业务逻辑也不在这里实现。一些界面控制可以在这里实现,上代码

 

package org.ssh.action;


import java.util.List;

import org.apache.struts2.ServletActionContext;
import org.ssh.pojo.Userinfo;
import org.ssh.service.UserManagerService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 用户管理控制器
 * */
public class UserManagerAct extends ActionSupport {

	private static final long serialVersionUID = -281275682819237996L;
	
	private Userinfo user = new Userinfo(); 
	
	private UserManagerService<Userinfo> userService;
	
	private List<Userinfo> users;
	
	private String searchText;
	
	public String doLogin(){
		if(this.user.getUname() == null || this.user.getPassword() == null) return INPUT;
		try {
			Userinfo user = userService.doLogin(this.user.getUname(), this.user.getPassword());
			if(user != null){
				ActionContext.getContext().getSession().put("userinfo", user);
				return doQuery();
			}else
				return INPUT;
		} catch (Exception e) {
			return ERROR;
		}
	}
	
	public String doQuery(){
		searchText = getParam("queryText");
		users = userService.queryUsers(searchText,Userinfo.class);
		return SUCCESS;
	}

	public String doAdd(){
		String result = "";
		try {
			String param = getParam("param");
			if(Integer.parseInt(param) > 0){
				user.setId(0);
				userService.addUser(user);
				result = doQuery();
			}else
				result = "addUser";
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public String doEdit(){
		try {
			Integer param = Integer.parseInt(getParam("param"));
			if(param == 0){
				Integer id = Integer.parseInt(getParam("id"));
				user = userService.getUser(Userinfo.class, id);
				return "editUser";
			}else if(param == 1){
				userService.modifyUser(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return doQuery();
	}
	
	public String doDelete(){
		try {
			Integer param = Integer.parseInt(getParam("id"));
			userService.deleteUser(param,Userinfo.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return doQuery();
	}
	
	protected String getParam(String key){
		return ServletActionContext.getRequest().getParameter(key);
	}
	
	public UserManagerService<Userinfo> getUserService() {
		return userService;
	}

	public void setUserService(UserManagerService<Userinfo> userService) {
		this.userService = userService;
	}

	public List<Userinfo> getUsers() {
		return users;
	}

	public Userinfo getUser() {
		return user;
	}

	public void setUser(Userinfo user) {
		this.user = user;
	}

	public String getSearchText() {
		return searchText;
	}

	public void setSearchText(String searchText) {
		this.searchText = searchText;
	}
}


 

至此所有的java代码已经完成接下来我们还要配置一些内容,目的是让ssh使用上面的代码。

1.配置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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<!-- 数据库配置 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver">
		</property>
		<property name="url"
			value="jdbc:mysql://localhost:3306/myssh">
		</property>
		<property name="username" value="anan"></property>
		<property name="password" value="xxxxxx"></property>
	</bean>
	
	<!--  -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 配置实体描述文件 -->
		<property name="mappingResources">
			<list>
				<value>org/ssh/pojo/Userinfo.hbm.xml</value>
			</list>
		</property>
	</bean>
	
	<bean id="userAct" class="org.ssh.action.UserManagerAct" scope="prototype">
		<property name="userService" ref="userService"></property>
	</bean>
	
	<bean id="userService" class="org.ssh.service.UserManagerService">
		<property name="dao" ref="dao"></property>
	</bean>
	
	<bean id="dao" class="org.ssh.dao.BaseDao">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
</beans>

这里主要是配置了hibernate加载我们的实体类Userinfo

同时配置了spring加载我们的dao,service和action...

 

2.struts.xml 配置action

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.objectFactory" value="spring" />
	<package name="MySSH" extends="struts-default">
		<global-results>
			<result name="error">/jsp/error.jsp</result>
			<result name="success">/jsp/success.jsp</result>
		</global-results>
		<action name="userManagerAct" class="userAct" method="doLogin">
			<result name="login">/index.jsp</result>
		</action>
		
		<action name="query" class="userAct" method="doQuery" />
		<action name="delete" class="userAct" method="doDelete" />
		<action name="edit" class="userAct" method="doEdit">
			<result name="editUser">/jsp/editUser.jsp</result>
		</action>
		
		<action name="add" class="userAct" method="doAdd">
			<result name="addUser">/jsp/addUser.jsp</result>
		</action>
	</package>
</struts>    

 

3.最后配置web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="3.0"   
    xmlns="http://java.sun.com/xml/ns/javaee"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  <display-name></display-name>   
    
    <!-- Spring配置和监听start -->  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>/WEB-INF/classes/application*.xml</param-value>  
    </context-param>  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
    <!--end-->  
    
  <welcome-file-list>  
    <welcome-file>index.jsp</welcome-file>  
  </welcome-file-list>  
  <filter>  
    <filter-name>struts2</filter-name>  
    <filter-class>  
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
    </filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>struts2</filter-name>  
    <url-pattern>*.action</url-pattern>  
  </filter-mapping></web-app> 


好了,配置完成了。接下来还要写一些jsp文件让这个蛋疼的东西飞起来

1.index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>用户登录</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
  		<font size="4">这个一个 struts2,spring 和 hibernate 使用的例子。请用以下账号密码登录<br>
  			默认账号/密码: <font color="red">anan/123</font><br>
  			<br>请事先在数据库插入用户信息
  		</font>
  			<br>
  			<br>
    	<form action="userManagerAct.action" method="post">
    		<table>
    			<tr>
    				<td>username</td><td><input type="text" name="user.uname"/></td>
    				<td>password</td><td><input type="password" name="user.password"/></td><td>密     码</td><td></td>
    			</tr>
    			<tr>
    				<td colspan="2">
    					<input type="submit" value="submit">
    					<input type="reset" value="reset">
    				</td>
    			</tr>
    		</table>
    	</form>
  </body>
</html>


2.addUser.jsp

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>user list page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
	<form action="add.action" method="post">
		<table width="500" align="center">
			<caption>ADD USER INFORMATION</caption>
			<tr height="26px">
				<td width="150px" align="right">UNAME</td>
				<td width="350px">
					<input type="hidden" name="param" value="1"/>
					<input type="text"  name="user.uname" value="${user.uname }"/>
				</td>
			</tr>
			<tr height="26px">
				<td align="right">PASSWORD</td>
				<td><input type="password"  name="user.password" value="${user.password }"/></td>
			</tr>
			<tr height="26px">
				<td align="right">SEX</td>
				<td>
					<select name="user.sex">
						<option value="male">male</option>
						<option value="female">female</option>
					</select>
				</td>
			</tr>
			<tr height="26px">
				<td align="right">TELPHONE</td>
				<td><input type="text"  name="user.telphone" value="${user.telphone }"/></td>
			</tr>
			<tr height="26px">
				<td align="right">ADDRESS</td>
				<td><input type="text"  name="user.address" value="${user.address }"/></td>
			</tr>
			<tr height="26px">
				<td colspan="2"  align="center" width="500">
					<input type="submit" value="Save"/>
					<input type="button" value="Back" οnclick="window.history.back(-1)"/>
				</td>
			</tr>
		</table>
	</form>
</body>
</html>


 

 


3.editUser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>user list page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
	<form action="edit.action" method="post">
		<table width="500" align="center">
			<caption>User Information Edit</caption>
			<tr height="26px">
				<td width="150px" align="right">NO.</td>
				<td width="350px">
					<input type="text"  name="user.id" value="${user.id }" readonly="readonly"/>
					<input type="hidden" name="user.password" value="${user.password }"/>
					<input type="hidden" name="param" value="1"/>
				</td>
			</tr>
			<tr height="26px">
				<td width="160" align="right">UNAME</td>
				<td><input type="text"  name="user.uname" value="${user.uname }"/></td>
			</tr>
			<tr height="26px">
				<td width="70" align="right">SEX</td>
				<td>
					<select name="user.sex">
						<option value="male">male</option>
						<option value="female">female</option>
					</select>
				</td>
			</tr>
			<tr height="26px">
				<td width="150"  align="right">TELPHONE</td>
				<td><input type="text"  name="user.telphone" value="${user.telphone }"/></td>
			</tr>
			<tr height="26px">
				<td width="300"  align="right">ADDRESS</td>
				<td><input type="text"  name="user.address" value="${user.address }"/></td>
			</tr>
			<tr height="26px">
				<td colspan="2" align="center">
					<input type="submit" value="Save"/>
					<input type="button" value="Back" οnclick="window.history.back(-1)"/>
				</td>
			</tr>
		</table>
	</form>
</body>
</html>


4.error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'error.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	
  </head>
  
  <body>
    	登录失败,2秒后自动转到登录页面....
    	<script type="text/javascript">
    		setTimeout(reDo, 2000);
    		function reDo(){
    			window.location.href = "/struts2_spring_hibernate1.0/index.jsp";
    		}
    	</script>
  </body>
</html>

5.sucess.jsp

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>user list page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
	<form action="query.action" method="post">
		<table align="center">
			<tr>
				<td style="vertical-align: middle;">USERNAME
					<input type="text" style="width: 300px;height: 30px;font-size: 16px" name="queryText"  value="${searchText }"/>
					<input type="submit" value="Query" style="width: 100px;height: 30px;font-size: 16px"/>
					<input type="button" value="Add" style="width: 100px;height: 30px;font-size: 16px" 
						οnclick="window.location.href='add.action?param=0'"/>
				</td>
			</tr>
		</table>
	</form>
	
	<table align="center" border="1" cellpadding="0" cellspacing="0" bordercolor="#3366cc">
		<tr align="center" bgcolor="#3399cc" height="26px">
			<td width="100">NO.</td>
			<td width="160">UNAME</td>
			<td width="70">SEX</td>
			<td width="150">TELPHONE</td>
			<td width="300">ADDRESS</td>
			<td width="120">EDIT/DELETE</td>
		</tr>
		
		<c:forEach var="user" items="${users }">
			<tr align="center"  height="24px">
				<td width="100">${user.id}</td>
				<td width="160">${user.uname}</td>
				<td width="70">${user.sex }</td>
				<td width="150">${user.telphone }</td>
				<td width="300">${user.address}</td>
				<td width="120">
					<a href="edit.action?param=0&id=${user.id}">编辑</a>  
					<a href="delete.action?id=${user.id}">删除</a>
				</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>


 

 

全部文件应该都搞定了,相比上一次的工程需要添加一些jar包,稍后我把整个工程代码上传。或者大家自己去找缺少的jar包

运行一下:

 

 

 

程序运行成功,有点成就感...

 

总结一下:

基于ssh开发环境搭建相比起来确实麻烦不少,特别是jar的依赖,而且要整套搞起来东西还是挺多的。但是搞鼓完了之后收获还是蛮大的,之前学习的很多概念性的东西都不理解,搞完这个之后貌似都有点感觉了。ssh真不愧是经典的框架之一,下次我将用注解来实现

 

工程下载地址:

http://download.csdn.net/detail/yunji3344/4890206

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值