struts2和hibernate整合的小Demo
创建一个web项目。
导入jar包
配置web.xml
<?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_3_1.xsd" version="3.1"> <-- Struts的核心过滤器配置--> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>*.jsp </url-pattern> </filter-mapping> </web-app>
在src 目录下创建 hibernate.cfg.xml,指定数据库“demo”
<?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"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/demo</property> <property name="connection.username">root</property> <property name="connection.password">123</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="current_session_context_class">thread</property> </session-factory> </hibernate-configuration>
创建一个User实体类
package com.test.pojo; /** * Created by Wdnnccey on 2016/10/24. */ public class User { private int uid; private String username; private String password; public User() { } public User(int uid, String username, String password) { this.uid = uid; this.username = username; this.password = password; } @Override public String toString() { return "User{" + "uid=" + uid + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
创建 :User.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"> <hibernate-mapping> <class name="com.test.pojo.User" table="user"> <id name="uid" column="uid"> <generator class="native"/> </id> <property name="username" column="username" type="java.lang.String" length="20" /> <property name="password" column="password" type="java.lang.String" length="20"/> </class> </hibernate-mapping>
创建一个包存放专门用来工具类,获取session操作等等。
HibernateUtils.java
package com.test.utils; import org.hibernate.Hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * Created by Wdnnccey on 2016/10/24. */ public class HibernateUtils { private static SessionFactory sessionFactory; //保证单例模式 private HibernateUtils(){ } //公有的静态方法 public static SessionFactory getSessionFactory(){ if(sessionFactory ==null){ Configuration configuration =new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); return sessionFactory; }else { return sessionFactory; } } }
在创建一个源码包,作为测试类使用,来创建表。 TestDemo.java
package com.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.metamodel.relational.Schema; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; /** * Created by Wdnnccey on 2016/10/24. */ public class TestDemo { @Test public void TestAll(){ Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory =configuration.buildSessionFactory(serviceRegistry); Session session = sessionFactory.getCurrentSession(); Transaction transaction = session.beginTransaction(); SchemaExport export =new SchemaExport(configuration); export.create(true,true); } }
成功创建user表。
在web目录下创建users-->目录存放-->login.jsp作为登陆页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陆页面</title> </head> <body> <form action="" method="post"> username:<input type="text" name="username"/><br> password:<input type="password" name="password"/><br> <input type="submit" value="tijiao"/> </form> </body> </html>
在web目录下创建users-->目录存放-->fails.jsp作为登陆失败后返回的页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
你失败了。
</body>
</html>
在web目录下创建users-->目录存放-->success.jsp作为登陆成功后返回的页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 你成功了。 </body> </html>
在src目录下创建一个struts.xml配置文件。
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> </package> <package name="users" namespace="/users" extends="default"> <!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍--> <action name="*_*" class="com.test.action.{1}Action" method="{2}"> <!--如果登陆成功返回的页面--> <result name="login_success">/users/success.jsp</result> <!--如果登陆失败返回的页面--> <result name="login_fails">/users/fails.jsp</result> </action> </package> </struts>
在src下创建一个dao层。 接口:userDao.java
import com.test.pojo.User; /** * Created by Wdnnccey on 2016/10/24. */ public interface UserDao { //用户登陆 public boolean userLogin(User user); }
在src下创建一个dao层的实现层。 userDaoImpl.java
; import com.test.pojo.User; import com.test.utils.HibernateUtils; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import java.util.List; /** * Created by Wdnnccey on 2016/10/24. */ public class UserDaoImpl implements UserDao{ @Override public boolean userLogin(User user) { //初始化事务 Transaction transaction =null; //创建一个hql语句,先初始化。 String hql =""; try { //用之前创建的utils工具来获取session Session session = HibernateUtils.getSessionFactory().getCurrentSession(); //创建事务并开启事务 transaction =session.beginTransaction(); //编写hql语句 hql = "from User where username=? and password =?"; //通过query去创建语句 Query query = session.createQuery(hql); //为hql语句中的?(问号),设置参数。(通过user实体类获取来user用户名和密码的信息) query.setParameter(0,user.getUsername()); query.setParameter(1,user.getPassword()); //HQL语句返回的是一个QUery对象,将Query对象query转换成集合,并且把该集合赋值给一个新的集合。 List<User> list =query.list(); //执行之前要提交事务 transaction.commit(); //判断是否验证到有用户存在 if(list.size()>0){ return true; }else { return false; } }catch (Exception e){ }finally { //将事务置为空 if(transaction!=null){ transaction=null; } } return false; } }
在src下创建一个action的包,用于存放action, 我们先写一个 SuperAction.java
关于为什么继承ActionSupport,请参考:http://www.cnblogs.com/wdnnccey/p/5994693.html
关于为什么要时间那些接口,请参考:http://www.cnblogs.com/wdnnccey/p/5994713.html
package com.test.action; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.util.ServletContextAware; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.ws.spi.http.HttpContext; /** * 所有action的父类 * Created by Wdnnccey on 2016/10/24. */ public class SuperAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{ protected HttpServletResponse response; protected HttpServletRequest request; protected ServletContext application; protected HttpSession session; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; this.session = this.request.getSession(); } @Override public void setServletResponse(HttpServletResponse response) { this.response =response; } @Override public void setServletContext(ServletContext application) { this.application=application; } }
在action包下创建 userAction.java
package com.test.action; import com.opensymphony.xwork2.ModelDriven; import com.test.pojo.User; import com.test.serivce.impl.UserDao; import com.test.serivce.impl.UserDaoImpl; /** * Created by Wdnnccey on 2016/10/24. */ public class UserAction extends SuperAction implements ModelDriven<User> { //初始化一个user对象 private User user = new User(); //这里使用模型驱动 //所谓ModelDriven ,意思是直接把实体类当成页面数据的收集对象。 @Override public User getModel() { return this.user; } /** * 登陆方法 * @return */ public String login() { UserDao dao = new UserDaoImpl(); //如果匹配的话 if (dao.userLogin(user)) { //返回正确页面,(session是通SuperAction得到的!
)
session.setAttribute("LoginUsername", user.getUsername());
//如果正确跳转到success页面,在struts.xml中有体现配置 return "login_success"; } else { //返回错页面 return "login_fails"; } }
}
我们在登陆之前要插入一条用户数据,以便登陆的时候去验证!
部署web项目,启动tomcat :
在这输入用户名以及密码 验证。
我先输入一个错误的信息,点击提交按钮:
这次我们输入一个正确的数据, 在数据库中存在的!
写到这里,我们完成了一个简单的登陆的功能,以及页面跳转。
我们想在登陆页面知道这个用户是谁:
在session域中取得,我们在登陆时候setattribute的值(session.setAttribute("LoginUsername", user.getUsername());)
在success.jsp页面添加如下:
欢迎你:(${sessionScope.LoginUsername})登陆!
再次登陆验证:
http://localhost:8081/users/login.jsp
如果我们想实现对这个用户的退出呢? 也很简单,把这个用户在session中移除即可,代码如下:
在userAction中编写注销方法:
/** * 注销方法 */ public String loginout() { //先去session中去获取值,查看当前用户是否为空 if (session.getAttribute("LoginUsername") != null) { //如果不等于空的话我们将他移出session session.removeAttribute("LoginUsername"); } //返回到登陆页面(这个return的值是通过struts.xml文件配置的) return "loginout_success"; }
在struts.xml的配置:(红色标注)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> </package> <package name="users" namespace="/users" extends="default"> <!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍--> <action name="*_*" class="com.test.action.{1}Action" method="{2}"> <!--如果登陆成功返回的页面--> <result name="login_success">/users/success.jsp</result> <!--如果登陆失败返回的页面--> <result name="login_fails">/users/fails.jsp</result> <!--退出用户的返回页面--> <result name="loginout_success">/users/login.jsp</result> </action> </package> </struts>
我们需要在登陆成功的success.jsp写上安全注销的链接(红色标注):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
你成功了。
<br><br><br>
欢迎你:(${sessionScope.LoginUsername})登陆!
<br><br><br>
<a href="/users/User_loginout.action">安全退出!</a>
</body>
</html>
测试注销方法:
看地址栏,能看出来 我们已经成功的退出当前用户!
不知道为什么 代码的格式没有复制上去,我就贴在这里啦:
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
</package>
<package name="users" namespace="/users" extends="default">
<!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍-->
<action name="*_*" class="com.test.action.{1}Action" method="{2}">
<!--如果登陆成功返回的页面-->
<result name="login_success">/users/success.jsp</result>
<!--如果登陆失败返回的页面-->
<result name="login_fails">/users/fails.jsp</result>
<!--退出用户的返回页面-->
<result name="loginout_success">/users/login.jsp</result>
</action>
</package>
</struts>