贴吧小项目总结(struts+hibernate)

一、项目架构分析

Web: struts2
Service
Dao: hibernate

二、构建项目

2.1 创建工程:

2.1.1 导入静态页面,放在WEB-INF下,并且将后缀名改为jsp:
在这里插入图片描述
2.1.2 将jsp标签头加入到修改后的静态页面中:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

在这里插入图片描述

2.2 导Struts包:

2.2.1 把struts2-blank中的lib下所有的包导入自己创建的工程:
在这里插入图片描述
2.2.2 把struts2-blank里classes目录下的struts.xml配置文件拷贝到自己创建工程的src:
在这里插入图片描述
2.2.3 在struts.xml中,配置sturts的Filter:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><constant name="struts.devMode" value="true" /><package name="default" namespace="/" extends="struts-default"><action name="topic_*" class="com.ly.tieba.web.action.TopicAction" method="{1}"><result name="list">/listTopics.jsp</result></action></package>
</struts>

在这里插入图片描述
2.2.4 在web.xml中,配置sturts的Filter:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--    配置Struts拦截器--><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>/*

在这里插入图片描述

2.3 导Hibernate包:

2.3.1 导入jar包:

在这里插入图片描述

2.3.1 导入hibernate.cfg.xml到src并配置基本信息:

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!--		数据库链接信息--><!-- 1、配置数据库连接的4个参数 --><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///tieba?serverTimezone=GMT%2B8<property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><!--  是否显示sql语句 --><property name="show_sql">true</property><!--  是否格式化sql语句 --><property name="format_sql">true</property><!--  是否自动提交事务 --><property name="hibernate.connection.autocommit">true</property><!--如果数据库没表,会创建表--><property name="hibernate.hbm2ddl.auto">update</property><!-- 开启与当前线程绑定的session功能--><property name="hibernate.current_session_context_class">thread</property></session-factory>
</hibernate-configuration>
2.4 配置javaBean和映射文件:
package com.ly.tieba.model;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Topic {private Integer tid;private String title;			//标题private String topicContent;	//内容private String ipAddr;			//ip地址(作者)private Date lastReplyDate;		//最后回复时间private Date createDate;		//发帖时间(创建时间)//一对多: 一个主题 可以拥有 【多个回复】private Set<Reply> replySet = new HashSet<Reply>();//并且提供get/set方法
}
package com.ly.tieba.model;
import java.util.Date;
public class Reply {private Integer rid;private String replyContent;	//回复的内容private String ipAddr;			//作者(回复人)private Date createDate;		//回帖时间private Topic topic;            //多对一:多个回复  属于 【一个主题】//并且提供get/set方法
}

Reply.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ly.tieba.model"><class name="Reply" table="t_reply" ><id name="rid" column="id"><generator class="native"></generator></id>
<!--        private String replyContent;	//回复的内容--><property name="replyContent" type="string"></property>
<!--        private String ipAddr;			//作者(回复人)--><property name="ipAddr" type="string"></property>
<!--        private Date createDate;		//回帖时间--><property name="createDate"></property>
<!--        private Topic topic; //多对一:多个回复  属于 【一个主题】--><many-to-one name="topic" class="Topic" column="topic_id"></many-to-one></class> 
</hibernate-mapping>

Topic.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ly.tieba.model"><class name="Topic" table="t_topic" ><id name="tid" column="id"><generator class="native"></generator></id>
<!--        private String title;			//标题--><property name="title" type="string"></property>
<!--        private String topicContent;	//内容--><property name="topicContent" type="string"></property>
<!--        private String ipAddr;			//ip地址(作者)--><property name="ipAddr" type="string"></property>
<!--        private Date lastReplyDate;		//最后回复时间--><property name="lastReplyDate"></property>
<!--        private Date createDate;		//发帖时间(创建时间)--><property name="createDate"></property><set name="replySet"><key column="topic_id"></key><one-to-many class="Reply"></one-to-many></set></class>
</hibernate-mapping>
2.4 配置事务拦截器(简化代码):
package com.ly.tieba.web.filter;
import com.ly.tieba.utils.HibernateUtils;
import org.hibernate.Session;
import javax.servlet.*;
import java.io.IOException;public class TransactionFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {System.out.println("事务拦截器.....");//开启事务Session session = HibernateUtils.getCurrentSession();session.getTransaction().begin();//放行,走action代码try {filterChain.doFilter(request,response);if(session != null && session.isOpen()){//提交事务session.getTransaction().commit();}}catch (Exception e){e.printStackTrace();session.getTransaction().rollback();//回滚}//关闭session【与线程绑定的session是不需要关闭的,会自动关闭】//session.close();}@Overridepublic void destroy() {}
}

Web.xml配置
在这里插入图片描述
Dao层中,代码简化:
在这里插入图片描述

2.5 HibernateUtils工具类(简化代码):
package com.ly.tieba.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {private static SessionFactory sf;static{//1.加载配置Configuration cfg = new Configuration().configure();//2.创建一个sessionFactorysf = cfg.buildSessionFactory();//3.在虚拟机关闭时,释放SessionFactoryRuntime.getRuntime().addShutdownHook(new Thread(){@Overridepublic void run() {sf.close();System.out.println("释放资源");}});}public static Session openSession(){return sf.openSession();}/*** 获取与当前线程绑定的session 要使用该方法,* 需要在hibernate.cfg.xml配置开启绑定线程的功能* 开启与当前线程绑定的session功能* 		thread* @return*/public static Session getCurrentSession(){return sf.getCurrentSession();}
}

三、保存话题、话题查询等功能问题总结

3.1 标签可查看后台传来的数据:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1 后台数据可存到前台ContextMap或者值栈中:

值栈:
action提供私有属性,并且提供get方法:
在这里插入图片描述
jsp页面中获取值栈数据,这里用struts的标签来遍历数组:
在这里插入图片描述
查看前台数据:
在这里插入图片描述
contextMap:
在这里插入图片描述
jsp获取contextMap中数据:
在这里插入图片描述
在这里插入图片描述

3.2 前台表单数据提交后台:

ModelDriven:参见Struts2中的ModelDriven机制及其运用.
ModelDriven背后的机制就是ValueStack。界面通过:title/topicContent这样的名称,就能够被直接赋值给user对象,这证明Topic对象正是ValueStack中的一个root对象!
那么,为什么Topic对象会在ValueStack中呢?它是什么时候被压入ValueStack的呢?答案是:ModelDrivenInterceptor(关于Interceptor的概念,请参考后续章节的说明)。ModelDrivenInterceptor是缺省的拦截器链的一部分,当一个请求经过ModelDrivenInterceptor的时候,在这个拦截器中,会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,则调用getModel()方法,并把返回值压入ValueStack。
在这里插入图片描述
在这里插入图片描述

最后,附一张struts页面请求响应流程图:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部