hibernate教程笔记9

留言板项目
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;      
		   }
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值