留言板项目
hibernate综合应用
部门留言板
struts+hibernate+接口编程方式,程序结构设计是重点。
1.需求
2.程序框架
3.build web项目
4.引入struts capabilities
5.完成web层 jsp+form+action
6.引入hibernate capabilities,domain->数据库
7.hibernate.cfg.xml
8.测试映射是否成功
9.使用接口来解耦web-接口-业务
懒加载问题
Users.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 package="com.qq.domain">
<class name="Users" lazy="false">
<id name="userid" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stucourse_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<property name="userpwd" type="java.lang.String">
<column name="userpwd" length="64"/>
</property>
<!-- sendMessage -->
<set name="sendMessage" lazy="false">
<key column="sender_id"/>
<one-to-many class="Message"/>
</set>
<!-- receiveMessage-->
<set name="receiveMessage" lazy="false">
<key column="receiver_id"/>
<one-to-many class="Message"/>
</set>
</class>
</hibernate-mapping>
运行结果
pass through LoginAction
Hibernate: select users0_.userid as userid0_, users0_.name as name0_, users0_.userpwd as userpwd0_ from Users users0_ where users0_.userid=? and users0_.userpwd=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
pass through GoMessageActionUi
Hibernate: select message0_.id as id1_, message0_.content as content1_, message0_.mesTime as mesTime1_, message0_.receiver_id as receiver4_1_, message0_.sender_id as sender5_1_ from Message message0_ where message0_.receiver_id=? or message0_.receiver_id=4
Hibernate: select users0_.userid as userid0_0_, users0_.name as name0_0_, users0_.userpwd as userpwd0_0_ from Users users0_ where users0_.userid=?
Hibernate: select users0_.userid as userid0_0_, users0_.name as name0_0_, users0_.userpwd as userpwd0_0_ from Users users0_ where users0_.userid=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
Hibernate: select receivemes0_.receiver_id as receiver4_2_, receivemes0_.id as id2_, receivemes0_.id as id1_1_, receivemes0_.content as content1_1_, receivemes0_.mesTime as mesTime1_1_, receivemes0_.receiver_id as receiver4_1_1_, receivemes0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message receivemes0_ left outer join Users users1_ on receivemes0_.sender_id=users1_.userid where receivemes0_.receiver_id=?
Hibernate: select sendmessag0_.sender_id as sender5_2_, sendmessag0_.id as id2_, sendmessag0_.id as id1_1_, sendmessag0_.content as content1_1_, sendmessag0_.mesTime as mesTime1_1_, sendmessag0_.receiver_id as receiver4_1_1_, sendmessag0_.sender_id as sender5_1_1_, users1_.userid as userid0_0_, users1_.name as name0_0_, users1_.userpwd as userpwd0_0_ from Message sendmessag0_ left outer join Users users1_ on sendmessag0_.receiver_id=users1_.userid where sendmessag0_.sender_id=?
Users.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 package="com.qq.domain">
<class name="Users" lazy="false">
<id name="userid" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stucourse_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<property name="userpwd" type="java.lang.String">
<column name="userpwd" length="64"/>
</property>
<!-- sendMessage -->
<set name="sendMessage">
<key column="sender_id"/>
<one-to-many class="Message"/>
</set>
<!-- receiveMessage-->
<set name="receiveMessage">
<key column="receiver_id"/>
<one-to-many class="Message"/>
</set>
</class>
</hibernate-mapping>
运行结果
pass through LoginAction Hibernate: select users0_.userid as userid0_, users0_.name as name0_, users0_.userpwd as userpwd0_ from Users users0_ where users0_.userid=? and users0_.userpwd=? pass through GoMessageActionUi Hibernate: select message0_.id as id1_, message0_.content as content1_, message0_.mesTime as mesTime1_, message0_.receiver_id as receiver4_1_, message0_.sender_id as sender5_1_ from Message message0_ where message0_.receiver_id=? or message0_.receiver_id=4 Hibernate: select users0_.userid as userid0_0_, users0_.name as name0_0_, users0_.userpwd as userpwd0_0_ from Users users0_ where users0_.userid=? Hibernate: select users0_.userid as userid0_0_, users0_.name as name0_0_, users0_.userpwd as userpwd0_0_ from Users users0_ where users0_.userid=?
Users.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 package="com.qq.domain">
<class name="Users">
<id name="userid" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stucourse_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<property name="userpwd" type="java.lang.String">
<column name="userpwd" length="64"/>
</property>
<!-- sendMessage -->
<set name="sendMessage">
<key column="sender_id"/>
<one-to-many class="Message"/>
</set>
<!-- receiveMessage-->
<set name="receiveMessage">
<key column="receiver_id"/>
<one-to-many class="Message"/>
</set>
</class>
</hibernate-mapping>
运行结果
pass through LoginAction
Hibernate: select users0_.userid as userid0_, users0_.name as name0_, users0_.userpwd as userpwd0_ from Users users0_ where users0_.userid=? and users0_.userpwd=?
pass through GoMessageActionUi
Hibernate: select message0_.id as id1_, message0_.content as content1_, message0_.mesTime as mesTime1_, message0_.receiver_id as receiver4_1_, message0_.sender_id as sender5_1_ from Message message0_ where message0_.receiver_id=? or message0_.receiver_id=4
hibernate中,取消懒加载,最好不要在one-to-many one的地方配置,可以在many的地方配置lazy=“false” 多个学生对一个部门,在
<class name="Student" lazy="false">
就可以在查询学生的时候,顺便把学生所在部门查出在。
Student s=(Student)session.get(Student.class,1);
但是如果是
<set name="stus" cascade="save-update" lazy="false">
开销就会很大。
Department d=(Department)session.(Department.class,2);
<set name="stus" cascade="save-update" lazy="true">
Department d=(Department)session.(Department.class,2); d.getStus();
就会报错。
矛盾是,session的范围太小了。在service里用完就关闭了。
10.通过openSessionView解决懒加载,缺点是session关闭延时。
11.添加消息的功能。
完整源码
<?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">
<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>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>MyFilter1</servlet-name>
<servlet-class>com.qq.filter.MyFilter1</servlet-class>
</servlet>
<filter>
<filter-name>MyFilter2</filter-name>
<filter-class>com.qq.filter.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyFilter1</servlet-name>
<url-pattern>/MyFilter1</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="userForm" type="com.qq.struts.form.UserForm" />
<form-bean name="messageForm" type="com.qq.struts.form.MessageForm" />
</form-beans>
<global-exceptions />
<global-forwards >
<forward name="ok" path="/ok.jsp" />
</global-forwards>
<action-mappings >
<action
attribute="userForm"
input="/login.jsp"
name="userForm"
parameter="flag"
path="/login"
scope="request"
type="com.qq.struts.action.LoginAction"
validate="false">
<forward name="loginok" path="/goMessageUi.do" />
<forward name="goLoginUi" path="/login.jsp" />
</action>
<action
input="/ok.jsp"
parameter="flag"
path="/goMessageUi"
type="com.qq.struts.action.GoMessageUiAction"
validate="false">
<forward name="goMessageUi" path="/showMessage.jsp" />
</action>
<action
attribute="messageForm"
input="/publishMessage.jsp"
name="messageForm"
parameter="flag"
path="/goPublishMessageUI"
scope="request"
type="com.qq.struts.action.GoPublishMessageUIAction">
<forward name="goPublishMessageUi" path="/publishMessage.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.qq.struts.ApplicationResources" />
</struts-config>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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 'index.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>
<jsp:forward page="/login.jsp"></jsp:forward>
</body>
</html>
<%@ 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 'login.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>
<h1>用户登录</h1>
<form action="/NoteBook/login.do?flag=login" method="post">
<table>
<tr><td>用户id</td><td><input type="text" name="userid" style="width:150px"/></td></tr>
<tr><td>用户pw</td><td><input type="password" name="userpwd" style="width:150px"/></td></tr>
<tr><td><input type="submit" value="登录"/></td><td><input type="reset" value="重新填写"/></td></tr>
</table>
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'showMessage.jsp' starting page</title>
</head>
<body>
<font size="5"><a href="${pageContext.request.contextPath }/goPublishMessageUI.do?flag=goPublishMessageUi">发布信息</a></font>
<font size="5">||<a href="/NoteBook/login.do?flag=logout">退出系统</a></font><br/>
欢迎${userInfo.name }留言信息:<br/>
<%=this.getServletContext().getContextPath() %>||
${pageContext.request.contextPath }
<form action="" method="post">
<table width="500px" border="1">
<tr>
<td>发送者</td><td>发送时间</td>
<td>接收者</td><td>信息内容</td>
</tr>
<c:forEach items="${messageList}" var="message">
<tr>
<td>${message.sender.name }</td>
<td>${message.mesTime}</td>
<td>${message.receiver.name }</td>
<td>${message.content}</td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
<%@ 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 'publishMessage.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>
<font size="6"><a href="#">查看信息</a></font><font size="6"><a href="#">退出系统</a></font>
<form action="${pageContext.request.contextPath }//goPublishMessageUI.do?flag=publishMessage" method="post">
<table border="1">
<tr><td>接收人</td><td><input type="text" name="receiver"/></td></tr>
<tr><td>发送内容</td><td><textarea name="content" rows="5" cols="20">请输入内容</textarea></td></tr>
<tr><td><input type="submit" value="发布"/></td><td><input type="reset" value="重新填写"/></td></tr>
</table>
</form>
</body>
</html>
<%@ 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 'ok.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>
<font color="red" size="6">操作成功,<a href="${pageContext.request.contextPath }/goMessageUi.do">返回留言板</a></font>
</body>
</html>
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:@127.0.0.1:1521:orcl
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.password">tiger</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="show_sql">true</property>
<!-- 配置 自动创建关系模型 -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/qq/domain/Users.hbm.xml" />
<mapping resource="com/qq/domain/Message.hbm.xml" />
</session-factory>
</hibernate-configuration>
package com.qq.domain;
import java.util.Set;
public class Users {
private Integer userid;
private String userpwd;
private String name;
//一个用户可以发送多个消息,也可以接收多个消息
private Set<Message> sendMessage;
private Set<Message> receiveMessage;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Message> getReceiveMessage() {
return receiveMessage;
}
public void setReceiveMessage(Set<Message> receiveMessage) {
this.receiveMessage = receiveMessage;
}
public Set<Message> getSendMessage() {
return sendMessage;
}
public void setSendMessage(Set<Message> sendMessage) {
this.sendMessage = sendMessage;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
}
<?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 package="com.qq.domain">
<class name="Users" lazy="false">
<id name="userid" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">stucourse_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="64"/>
</property>
<property name="userpwd" type="java.lang.String">
<column name="userpwd" length="64"/>
</property>
<!-- sendMessage -->
<set name="sendMessage">
<key column="sender_id"/>
<one-to-many class="Message"/>
</set>
<!-- receiveMessage-->
<set name="receiveMessage">
<key column="receiver_id"/>
<one-to-many class="Message"/>
</set>
</class>
</hibernate-mapping>
package com.qq.domain;
public class Message {
private Integer id;
private java.util.Date mesTime;
private String content;
private Users sender;
private Users receiver;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public java.util.Date getMesTime() {
return mesTime;
}
public void setMesTime(java.util.Date mseTime) {
this.mesTime = mseTime;
}
public Users getReceiver() {
return receiver;
}
public void setReceiver(Users receiver) {
this.receiver = receiver;
}
public Users getSender() {
return sender;
}
public void setSender(Users sender) {
this.sender = sender;
}
}
<?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 package="com.qq.domain">
<class name="Message">
<id name="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">mes_seq</param>
</generator>
</id>
<!-- 普通属性 -->
<property name="content" type="java.lang.String">
<column name="content" length="2000"/>
</property>
<property name="mesTime" type="java.util.Date">
<column name="mesTime"/>
</property>
<!-- 配置receiver属性-->
<many-to-one name="receiver" column="receiver_id"/>
<!-- 配置sender属性 -->
<many-to-one name="sender" column="sender_id"/>
</class>
</hibernate-mapping>
package com.qq.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.qq.util.*;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class MyFilter1 extends HttpServlet implements Filter {
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
Session session=null;
Transaction tx=null;
try {
//getCurrentSession();与线程绑定,保证开始到结束是同一个session
session=HibernateUtil.getCurrentSession();
tx=session.beginTransaction();
arg2.doFilter(arg0, arg1);
tx.commit();
} catch (Exception e) {
// TODO: handle exception
if(tx!=null){
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
/* if(session.isOpen() && session!=null){
session.close();
} 这种关闭方法不安全*/
HibernateUtil.closeCurrentSession();
}
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
package com.qq.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFilter2 extends HttpServlet implements Filter {
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
arg0.setCharacterEncoding("utf-8");
arg2.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qq.struts.form;
import org.apache.struts.action.ActionForm;
/**
* MyEclipse Struts
* Creation date: 02-27-2020
*
* XDoclet definition:
* @struts.form name="messageForm"
*/
public class MessageForm extends ActionForm {
private String content;
private String receiver;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
}
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qq.struts.form;
import org.apache.struts.action.ActionForm;
/**
* MyEclipse Struts
* Creation date: 02-26-2020
*
* XDoclet definition:
* @struts.form name="userForm"
*/
public class UserForm extends ActionForm {
private String userid;
private String userpwd;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
}
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qq.struts.action;
import com.qq.service.*;
import com.qq.service.inter.*;
import com.qq.domain.*;
import com.qq.struts.form.*;
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.actions.DispatchAction;
import javax.servlet.http.HttpServletRequest;;
/**
* MyEclipse Struts
* Creation date: 02-26-2020
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class LoginAction extends DispatchAction{
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
//响应login请求
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("pass through LoginAction");
UserForm userForm=(UserForm)form;
//使用usersService对象完成用户登录验证,有一定耦合性
//调用接口解耦
UsersServiceInterface usersServiceInterface=new UsersServiceImp();
Users user=new Users();
//String 转 Integer
user.setUserid(Integer.parseInt(userForm.getUserid()));
user.setUserpwd(userForm.getUserpwd());
user=usersServiceInterface.checkUser(user);
// usersServiceInterface.findById(clazz, id)用基础接口,基础实现类解决了代码的复用性问题
if(user!=null){
//合法,将user对象放入session以备后用
request.getSession().setAttribute("userInfo", user);
return mapping.findForward("loginok");
}else{
return mapping.findForward("goLoginUi");
}
}
/*
* 响应logout
*/
public ActionForward logout(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
//清空session
request.getSession().invalidate();
return mapping.findForward("goLoginUi");
}
}
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qq.struts.action;
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.actions.DispatchAction;
import com.qq.service.inter.*;
import com.qq.service.*;
import java.util.List;
import com.qq.domain.*;
/**
* MyEclipse Struts
* Creation date: 02-26-2020
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class GoMessageUiAction extends DispatchAction {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
//获取留言信息
System.out.println("pass through GoMessageActionUi");
//取出当前登录的用户
Users loginUser=(Users)request.getSession().getAttribute("userInfo");
//取出该用户收到的信息
MessageServiceInterface messageServiceInterface=new MessageServiceImp();
List<Message> list=messageServiceInterface.showMessage(loginUser);
//把list集合放到session、request、application、pageContext?
request.setAttribute("messageList", list);
return mapping.findForward("goMessageUi");
}
}
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.qq.struts.action;
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.actions.DispatchAction;
import com.qq.service.*;
import com.qq.service.inter.MessageServiceInterface;
import com.qq.service.inter.UsersServiceInterface;
import com.qq.struts.form.*;
import com.qq.domain.*;
import java.util.Date;
/**
* MyEclipse Struts
* Creation date: 02-27-2020
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class GoPublishMessageUIAction extends DispatchAction {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @function to to publishMessage.jsp
*/
public ActionForward goPublishMessageUi(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("pass through GoPublishMessageUIAction");
return mapping.findForward("goPublishMessageUi");
}
/**
*
*/
public ActionForward publishMessage(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
//获取表单
MessageForm messageForm=(MessageForm)form;
//创建一个Message对象
Message message=new Message();
message.setContent(messageForm.getContent());
UsersServiceInterface usersServiceInterface=new UsersServiceImp();
message.setReceiver(usersServiceInterface.getUserByName(messageForm.getReceiver()));//需要一个方法,通过用户名字获得对象
message.setMesTime(new Date());
message.setSender((Users)request.getSession().getAttribute("userInfo"));
//usersServiceInterface.save(message);
//保存的是message对象,应当通过messageServiceInterface接口实例来保存,提高可读性
MessageServiceInterface messageServiceInterface=new MessageServiceImp();
messageServiceInterface.save(message);
return mapping.findForward("ok"); //全局跳转
}
}
package com.qq.service.inter;
import com.qq.domain.Users;;
public interface UsersServiceInterface extends BasicInterface{
public Users checkUser(Users u);
public Users getUserByName(String name);
}
package com.qq.service.inter;
import com.qq.domain.*;
import java.util.List;
public interface MessageServiceInterface extends BasicInterface {
//显示用户接收到的所有message
public List<Message> showMessage(Users u);
}
package com.qq.service;
import com.qq.util.*;
import java.io.Serializable;
import java.util.List;
import com.qq.service.inter.BasicInterface;
public abstract class BasicServiceImp implements BasicInterface{
public List<Object> getListObject(String hql, String[] parameters) {
// TODO Auto-generated method stub
return null;
}
public Object getUiqueObject(String hql, String[] parameters) {
// TODO Auto-generated method stub
return null;
}
public Object findById(Class clazz, Serializable id) {
// TODO Auto-generated method stub
return HibernateUtil.findById(clazz, id);
}
/*
* 根据id号删除
*/
public void save(Object obj){
try {
HibernateUtil.save(obj);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e.getMessage());
}
}
}
package com.qq.service;
import com.qq.service.inter.*;
import com.qq.domain.*;
import com.qq.util.*;
import java.util.List;
/*
* @author
* @function这是一个业务层类,完成对users domain对象的各种操作
* @param
*/
public class UsersServiceImp extends BasicServiceImp implements UsersServiceInterface{
public Users getUserByName(String name) {
// TODO Auto-generated method stub
String hql="from Users where name=?";
String parameters[]={name};
Users user=null;
try {
user=(Users)HibernateUtil.uniqueQuery(hql, parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
return user;
}
/*
* @author
* @function用户登录验证
* @param
* @return 如果验证合法返回一个Users对象,如果失败返回null
*/
public Users checkUser(Users u){
String hql="from Users where userid=? and userpwd=?";
String parameters[]={u.getUserid()+"",MyTools.MD5(u.getUserpwd())};
//体现hibernate的鲁棒性
List<Users> list=HibernateUtil.executeQuery(hql, parameters);
if(list.size()==0){
return null;
}else{
return list.get(0);
}
}
/*
* @function通过id返回一个User对象
*/
/*
* @function通过id删除一个User对象
*/
}
package com.qq.service;
import java.util.List;
import com.qq.util.*;
import org.hibernate.Hibernate;
import com.qq.domain.Users;
import com.qq.domain.Message;
import com.qq.service.inter.MessageServiceInterface;
import sun.security.jgss.spi.MechanismFactory;
public class MessageServiceImp extends BasicServiceImp implements MessageServiceInterface {
public List<Message> showMessage(Users u) {
// TODO Auto-generated method stub
String hql="from Message where receiver.userid=? or receiver.userid=4";
String parameters[]={u.getUserid()+""};
List<Message> messages=HibernateUtil.executeQuery(hql, parameters);
return messages;
}
}
package com.qq.util;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil {
private static SessionFactory sessionFactory=null;
//使用线程局部模式
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private HibernateUtil(){};
static {
sessionFactory=new Configuration().configure().buildSessionFactory();
}
//获取全新的全新的sesession
public static Session openSession(){
return sessionFactory.openSession();
}
//获取和线程关联的session
public static Session getCurrentSession(){
Session session=threadLocal.get();
//判断是否得到
if(session==null){
session=sessionFactory.openSession();
//把session对象设置到 threadLocal,相当于该session已经和线程绑定
threadLocal.set(session);
}
return session;
}
public static void closeCurrentSession(){
Session s=getCurrentSession();
if(s!=null&& s.isOpen() ){
s.close();
threadLocal.set(null);
}
}
//这里提供一个根据id返回对象的方法
public static Object findById(Class clazz,java.io.Serializable id){
Session s=null;
Transaction tx=null;
Object obj=null;
try {
s=openSession();
tx=s.beginTransaction();
obj=s.load(clazz, id);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
return obj;
}
//统一的一个修改和删除(批量 hql) hql"delete upate ...??"
public static void executeUpdate(String hql,String [] parameters){
Session s=null;
Transaction tx=null;
try {
s=openSession();
tx=s.beginTransaction();
Query query=s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters!=null&& parameters.length>0){
for(int i=0;i<parameters.length;i++){
query.setString(i, parameters[i]);
}
}
query.executeUpdate();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
}
//如果要配置openSessionInView
//统一的一个修改和删除(批量 hql) hql"delete upate ...??"
public static void executeUpdateOpenInView(String hql,String [] parameters){
Session s=getCurrentSession();
Query query=s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters!=null&& parameters.length>0){
for(int i=0;i<parameters.length;i++){
query.setString(i, parameters[i]);
}
}
query.executeUpdate();
}
//统一的添加的方法
public static void save(Object obj){
Session s=null;
Transaction tx=null;
try {
s=openSession();
tx=s.beginTransaction();
s.save(obj);
tx.commit();
} catch (Exception e) {
if(tx!=null){
tx.rollback();
}
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null && s.isOpen()){
s.close();
}
}
}
//提供一个统一的查询方法(带分页) hql 形式 from 类 where 条件=? ..
public static List executeQueryByPage(String hql,String [] parameters,int pageSize,int pageNow){
Session s=null;
List list=null;
try {
s=openSession();
Query query=s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters!=null&& parameters.length>0){
for(int i=0;i<parameters.length;i++){
query.setString(i, parameters[i]);
}
}
query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
list=query.list();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
return list;
}
//提供一个统一的查询方法 hql 形式 from 类 where 条件=? ..
public static List executeQuery(String hql,String [] parameters){
Session s=null;
List list=null;
try {
s=openSession();
Query query=s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters!=null&& parameters.length>0){
for(int i=0;i<parameters.length;i++){
query.setString(i, parameters[i]);
}
}
list=query.list();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
return list;
}
// 提供一个统一的查询方法 只返回一个对象
public static Object uniqueQuery(String hql,String [] parameters){
Session s=null;
Object obj=null;
try {
s=openSession();
Query query=s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters!=null&& parameters.length>0){
for(int i=0;i<parameters.length;i++){
query.setString(i, parameters[i]);
}
}
obj=query.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
// TODO: handle exception
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
return obj;
}
}
package com.qq.util;
import java.security.*;
import java.security.spec.*;
public class MyTools {
public final static String MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[] strTemp = s.getBytes();
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}