`

使用Struts2.0+Spring2.0+Hibernate3整合开发实现

阅读更多

本文利用一个简单的实例来实现数据表的增加、修改、删除和查询操作。使用Struts2.0、Spring2.0和Hibernate3。

数据库采用MySQL。现在开始进入开发,使用的IDE为MyEclipse6

  •  首先创建数据库MyDB,在其中建立表UserInfo,表中包含3个字段

 

userid,username,password,其中userid为自动增长字段

  •  创建MyEclipse下的Web Project,名称为UserWeb,在项目中加入Struts2,Spring2和Hibernate3所需要的类库文件。在添加spring2类库文件时,将配置文件applicationContext.xml放置到站点的WEB-INF目录下
  • 在当前项目中使用了struts2,spring2,所以需要对两种框架进行整合,整合的步骤就是在web.xml中进行struts2和spring2的配置,配置如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

 xmlns="http://java.sun.com/xml/ns/j2ee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <filter>

  <filter-name>struts2</filter-name>

  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 </filter>

 <filter-mapping>

  <filter-name>struts2</filter-name>

  <url-pattern>/*</url-pattern>

 </filter-mapping>

 

 <listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

 </listener>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

  • 因为首先得是对简单表的增删改查操作,而且使用的是hibernate持久化,所以需要建立持久化类(JOPO类)和映射文件(hbm文件),在工程的src下建立com.frank.obj包,并在其中分别创建持久化类Userinfo.java和映射文件Userinfo.hbm.xml,建立过程可以通过IDE自动生成,代码如下:
  • Userinfo.java

 

package com.frank.obj;

import java.lang.SuppressWarnings;

/**

 * Userinfo entity.

 *

 * @author MyEclipse Persistence Tools

 */

@SuppressWarnings("serial")

public class Userinfo implements java.io.Serializable {

 // Fields

 private Integer userid;

 private String username;

 private String password;

 // Constructors

 /** default constructor */

 public Userinfo() {

 }

 /** full constructor */

 public Userinfo(String username, String password) {

  this.username = username;

  this.password = password;

 }

 // Property accessors

 public Integer getUserid() {

  return this.userid;

 }

 public void setUserid(Integer userid) {

  this.userid = userid;

 }

 public String getUsername() {

  return this.username;

 }

 public void setUsername(String username) {

  this.username = username;

 }

 public String getPassword() {

  return this.password;

 }

 public void setPassword(String password) {

  this.password = password;

 }

}

  • Userinfo.hbm.xml

 

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class table="userinfo" catalog="mydb">

        <id type="java.lang.Integer">

            <column />

            <generator />

        </id>

        <property type="java.lang.String">

            <column length="20" not-null="true" />

        </property>

        <property type="java.lang.String">

            <column length="20" not-null="true" />

        </property>

    </class>

</hibernate-mapping>

  • 在src下建立一个名称为struts.xml的文件,此文件作为struts2的配置文件,配置诸如action、interceptor等,文件样式如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>

 <include file="struts-default.xml"/>

 <package extends="struts-default">

 </package>

</struts>

  • 首先实现登录功能,登录成功后显示所有用户的列表
  • 首先建立实现操作的业务类UserDAO,业务类中的方法利用hibernateTemplate(hibernate模板实现CRUD操作),其中先实现登录验证方法checkUser,代码如下:

 

package com.frank.dao;

import org.hibernate.HibernateException;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.frank.obj.Userinfo;

public class UserDAo {

 private HibernateTemplate hibernateTemplate;

 public HibernateTemplate getHibernateTemplate() {

  return hibernateTemplate;

 }

 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

  this.hibernateTemplate = hibernateTemplate;

 }

 

 public boolean checkUser(Userinfo user){

  try{

   String queryString="from UserInfo user where user.username=? and user.password=?";

   List list=hibernateTemplate.find(queryString,new Object[]{user.getUsername(),user.getPassword()});

   if(list.size()>0){

    return true;

   }else{

    return false;

   }

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

}

其中hibernateTemplate是以后利用Spring配置进行注入,利用此模板实现持久化操作

  • 在本工程中,建立所有业务类的入口类RuleDAO,以后利用此入口类可以得到所有需要的业务类,代码如下:

 

package com.frank.dao;

public class RuleDAO {

 private UserDAo userDAo;

 public UserDAo getUserDAo() {

  return userDAo;

 }

 public void setUserDAo(UserDAo userDAo) {

  this.userDAo = userDAo;

 }

 

}

 

  • 然后建立struts2的控制器,在这里,建立一个所有控制器的父类,实现所有控制器的通用功能,以便其他的具体控制器继承。控制器调用业务类实现操作,并进行转发控制,父类BaseAction代码如下:

 

package com.frank.action;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

import com.frank.dao.RuleDAO;

import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport {

 public RuleDAO getRuleDAO(){

  ServletContext servletContext=ServletActionContext.getServletContext();

  WebApplicationContext webApplicationContext=WebApplicationContextUtils.getWebApplicationContext(servletContext);

  return (RuleDAO)webApplicationContext.getBean("ruleDAO");

 }

 public HttpServletRequest request(){

  return ServletActionContext.getRequest();

 }

 public HttpServletResponse response(){

  return ServletActionContext.getResponse();

 }

 public HttpSession session(){

  return ServletActionContext.getRequest().getSession();

 }

 public ServletContext application(){

  return ServletActionContext.getServletContext();

 }

}

  • 现在开始建立具体的控制器类UserAction,以便实现对用户业务操作的各种控制,因为控制器要实现多种控制,所以我们放弃控制器默认的execute契约方法,使用我们自己定义的契约方法,比如实现登录控制的方法在这里为login,如果验证成功,返回SUCCESS,具体代码如下:

 

package com.frank.action;

import com.frank.obj.Userinfo;

public class UserAction extends BaseAction {

 private Userinfo user;

 public Userinfo getUser() {

  return user;

 }

 public void setUser(Userinfo user) {

  this.user = user;

 }

 

 public String login() throws Exception{

  if(this.getRuleDAO().getUserDAo().checkUser(user)){

   return SUCCESS;

  }

  return INPUT;

 }

 @Override

 public String execute() throws Exception {

  // TODO Auto-generated method stub

  return super.execute();

 }

 

}

因为控制要获取页面传入的数据,所以需要声明相应的数据成员(名称相同,而且必须要有符合命名规范的set和get方法),这样在页面提交数据并请求此控制器的时候,可以利用此数据成员获取用户输入的数据。比如这里利用Userinfo类型的user数据成员获取数据,以便调用业务方法进行适当的验证。明显的,我们知道验证的契约方法为我们自己定义的login,如果验证成功,返回SUCCESS

  • 如果要使用此控制器,并使用我们定义的契约方法,我们需要在struts.xml配置文件中对此控制器进行正确的配置,如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>

 <include file="struts-default.xml"/>

 <package extends="struts-default">

  <action method="login">

   <result>userList.jsp</result>

   <result >login.jsp</result>

  </action>

 </package>

</struts>

在此配置了一个控制器,其中控制器的请求名称为“login”,使用的契约方法为“login”,成功时转发到userList.jsp,失败时,返回到login.jsp

  • 好了,现在进行登录页面的设计,非常的简单,只是要注意请求的action设置,还有就是输入单元的名称设置,新建一个名称为login.jsp,在此输入表单采用struts2的表单标签,所以需要在头部使用taglib指令引用struts2标签库,具体代码如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <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>Welcome Login:</h1>

    <s:form action="login.action">

     <s:textfield label="username"/><br>

     <s:textfield label="password"/><br>

     <s:submit/>

    </s:form>

  </body>

</html>

  • 建立一个名称为userList.jsp进行测试操作(成功的话转发到这个页面),在此只是简单的设置一些内容,以后进行修改

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

   

    <title>My JSP 'userList.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>Login Success!!!</H1>

  </body>

</html>

  • 好了,现在可以开始进行spring的bean配置了,具体配置代码如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

 <bean >

  <property >

   <value>com.mysql.jdbc.Driver</value>

  </property>

  <property >

   <value>jdbc:mysql://localhost:3306/mydb</value>

  </property>

  <property >

   <value>root</value>

  </property>

  <property >

   <value>123456</value>

  </property>

 </bean>

 <bean >

  <property >

   <ref bean="dataSource"/>

  </property>

  <property >

   <list>

    <value>com/frank/obj/Userinfo.hbm.xml</value>

   </list>

  </property>

  <property >

   <props>

    <prop key="hibernate.show_sql">true</prop>

    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

   </props>

  </property>

 </bean>

 <bean >

  <property >

   <ref bean="sessionFactory"/>

  </property>

 </bean>

 <bean >

  <property >

   <ref bean="hibernateTemplate"/>

  </property>

 </bean>

 <bean >

  <property >

   <ref bean="userDAo"/>

  </property>

 </bean>

 <bean >

  <property >

   <ref bean="sessionFactory"/>

  </property>

 </bean>

 <tx:advice transaction-manager="txManager">

  <tx:attributes>

   <tx:method propagation="REQUIRED"/>

   <tx:method propagation="REQUIRED"/>

   <tx:method propagation="REQUIRED"/>

   <tx:method propagation="SUPPORTS" read-only="true"/>

  </tx:attributes>

 </tx:advice>

 <aop:config>

  <aop:pointcut expression="execution(* com.frank.dao..*.*(..))"/>

  <aop:advisor advice-ref="myadvice" pointcut-ref="userPointcut"/>

 </aop:config>

</beans>

  • 部署、启动web服务器,测试(在建立的Userinfo表中增加几个用户作为测试用户名和密码)
  • 如果启动时出现错误,需要删除你的类库文件中的asm-2.3.6.jar文件
  • 验证如下:

 

输入正确的用户名和密码后,登录,出现如下页面,测试成功!!!

 

 

 

在上一篇文章中实现了基本的登录操作。当登录成功后,转发到userList.jsp页面,此页面显示现有的所有用户列表(只是模拟查询操作,没有实际的业务含义)。所以需要修改相应的组件。

首先,因为从login控制器转发到userList.jsp,所以控制器login需要为userList.jsp准备数据(当然,准备的是所有用户的信息)。在这里需要修改UserAction,在其中加入集合数据类users(List类型),此数据成员用于获取所有用户对象,然后提供给userList.jsp。

同样需要修改业务类UserDAO,增加获取用户集合的方法,然后在login中登录成功后进行调用,将集合数据放置到users数据成员中,进而提供给userList.jsp。修改后如下:

UserDAo.java

package com.frank.dao;

import org.hibernate.HibernateException;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.frank.obj.Userinfo;

public class UserDAo {

 private HibernateTemplate hibernateTemplate;

 public HibernateTemplate getHibernateTemplate() {

  return hibernateTemplate;

 }

 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

  this.hibernateTemplate = hibernateTemplate;

 }

 

 public boolean checkUser(Userinfo user){

  try{

   String queryString="from Userinfo user where user.username=? and user.password=?";

   List list=hibernateTemplate.find(queryString,new Object[]{user.getUsername(),user.getPassword()});

   if(list.size()>0){

    return true;

   }else{

    return false;

   }

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

 public List getAllUsers(){

  try{

   String queryString="from Userinfo";

   List list=hibernateTemplate.find(queryString);

   return list;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return null;

  }

 }

}

UserAction.java

package com.frank.action;

import java.util.List;

import com.frank.obj.Userinfo;

public class UserAction extends BaseAction {

 private Userinfo user;

 private List users;

 public Userinfo getUser() {

  return user;

 }

 public void setUser(Userinfo user) {

  this.user = user;

 }

 

 public String login() throws Exception{

  if(this.getRuleDAO().getUserDAo().checkUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return SUCCESS;

  }

  return INPUT;

 }

 @Override

 public String execute() throws Exception {

  // TODO Auto-generated method stub

  return super.execute();

 }

 public List getUsers() {

  return users;

 }

 public void setUsrs(List users) {

  this.users = users;

 }

 

}

userList.jsp用户显示所有用户的信息,通过使用struts2的iterator标签实现对users集合的迭代操作,显示用户列表。修改如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'userList.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>

    <table width="80%" border="1">

     <thead>

      <tr>

       <th width="20%">UserId</th>

       <th width="20%">UserName</th>

       <th width="20%">Password</th>

        <th width="20%">Update</th>

       <th width="20%">Delete</th>      

      </tr>

     </thead>

     <s:iterator value="users">

     <tr>

      <td width="20%">&nbsp;<s:property value="userid"/></td>

      <td width="20%">&nbsp;<s:property value="username"/></td>

      <td width="20%">&nbsp;<s:property value="password"/></td>

      <td width="20%">&nbsp;<a href='<s:url value="userEdit.action"><s:param name="userid" value="userid"/></s:url>'>update</a></td>

      <td width="20%">&nbsp;<a href='<s:url value="userDelete.action"><s:param name="userid" value="userid"/></s:url>'>delete</a></td>                        

                        

     </tr>

     </s:iterator>

    </table>

  </body>

</html>

红体部分作为后面的修改、删除用,稍后讲解。

当登录成功后,显示用户列表,如下:

 

红色部分为为对已存在在的数据进行修改和删除操作。此处使用了struts2的<s:url>标签。url标签可以定义一个控制器请求映射,其中包括<s:param>,作为请求参数。比如此处,请求参数名称为userid,而请求参数的值为当前记录的userid字段值(即主键编号),控制器可以获取请求参数的值,进而进行特定的处理。比如修改的时候,控制器可以通过当前的参数(<s:param>)获取需要修改的记录的编号。

修改的时候请求的控制器映射为userEdit.action,所以需要配置此控制器,修改后的struts.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>

 <include file="struts-default.xml"/>

 <package name="default" extends="struts-default">

  <action name="login" class="com.frank.action.UserAction" method="login">

   <result>userList.jsp</result>

   <result name="input">login.jsp</result>

  </action>

  <action name="userEdit" class="com.frank.action.UserAction" method="readyUpdate">

   <result>userUpdate.jsp</result>

   <result name="input">error.jsp</result>

  </action>

 </package>

</struts>

通过上述配置可知,userEdit同样对应UserAction类,但是契约方法为readyUpdate。成功后转发到userUpdate.jsp.

readyUpdate契约方法通过UserDAo业务对象中的方法获取需要修改的用户对象,然后转发到userUpdate.jsp,显示需要修改的用户数据。

所以UserDAo业务类中需要添加一个通过用户编号获取用户对象的方法,修改后如下:

package com.frank.dao;

import org.hibernate.HibernateException;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.frank.obj.Userinfo;

public class UserDAo {

 private HibernateTemplate hibernateTemplate;

 public HibernateTemplate getHibernateTemplate() {

  return hibernateTemplate;

 }

 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

  this.hibernateTemplate = hibernateTemplate;

 }

 

 public boolean checkUser(Userinfo user){

  try{

   String queryString="from Userinfo user where user.username=? and user.password=?";

   List list=hibernateTemplate.find(queryString,new Object[]{user.getUsername(),user.getPassword()});

   if(list.size()>0){

    return true;

   }else{

    return false;

   }

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

 public Userinfo getUserById(int userid){

  try{

   Userinfo user=(Userinfo)hibernateTemplate.load(Userinfo.class, new Integer(userid));

   return user;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return null;

  }

 }

 public List getAllUsers(){

  try{

   String queryString="from Userinfo";

   List list=hibernateTemplate.find(queryString);

   return list;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return null;

  }

 }

}

UserAction新增的业务方法readyUpdate通过用户编号获取需要修改的用户对象,进而让userUpdate.jsp使用,修改后的代码如下:

package com.frank.action;

import java.util.List;

import com.frank.obj.Userinfo;

public class UserAction extends BaseAction {

 private Userinfo user;

 private List users;

 private int userid;//新增的数据成员,用户获得列表页面传入的参数值

 public int getUserid() {

  return userid;

 }

 public void setUserid(int userid) {

  this.userid = userid;

 }

 public Userinfo getUser() {

  return user;

 }

 public void setUser(Userinfo user) {

  this.user = user;

 }

 public String readyUpdate() throws Exception{

  user=this.getRuleDAO().getUserDAo().getUserById(userid);

  if(user!=null){

   return SUCCESS;

  }

  return INPUT;

 }

 public String login() throws Exception{

  if(this.getRuleDAO().getUserDAo().checkUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return SUCCESS;

  }

  return INPUT;

 }

 @Override

 public String execute() throws Exception {

  // TODO Auto-generated method stub

  return super.execute();

 }

 public List getUsers() {

  return users;

 }

 public void setUsrs(List users) {

  this.users = users;

 }

 

}

 新创建userUpdate.jsp,用于显示需要修改的用户信息,用户可以在此页面中对现有数据进行修改,然后持久化到数据库中,页面如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'userUpdate.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>Update User</h1><br>

    <s:form action="userUpdateDo.action">

     <s:textfield name="user.userid" label="UserId:" readonly="true"/>

     <s:textfield name="user.username" label="UserName:"/><br>

     <s:textfield name="user.password" label="Password:"/><br>

     <s:submit/>

    </s:form>

  </body>

</html>

这样,当在用户列表中点击“update”超链接时,显示如下:(此时编号只读)

 

 现在我们可以在原有数据的基础上进行修改,然后提交持久化修改结果。

注意当提交修改结果的时候,请求的控制器映射为userUpdateDo.action,所以需要对此映射进行配置,同样使用UserAction,但是需要更改契约方法,此方法名称为updateUser,调用业务类UserDAo中的方法真正实现数据的更新。

修改后的struts.xml如下:(配置了一个新的action名称为userUpdateDo.action)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>

 <include file="struts-default.xml"/>

 <package name="default" extends="struts-default">

  <action name="login" class="com.frank.action.UserAction" method="login">

   <result>userList.jsp</result>

   <result name="input">login.jsp</result>

  </action>

  <action name="userEdit" class="com.frank.action.UserAction" method="readyUpdate">

   <result>userUpdate.jsp</result>

   <result name="input">error.jsp</result>

  </action>

  <action name="userUpdateDo" class="com.frank.action.UserAction" method="updateUser">

   <result>userList.jsp</result>

   <result name="input">error.jsp</result>

  </action>

 </package>

</struts>

成功后显示最新的结果

同时需要在业务类UserDAo中增加更新对象的方法,增加如下方法:

 public boolean updateUser(Userinfo user){

  try{

   hibernateTemplate.update(user);

   return true;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

在控制器类调用此方法完成数据的更新,因为修改控制器的契约方法为updateUser,所以控制器UserAction修改如下:

package com.frank.action;

import java.util.List;

import com.frank.obj.Userinfo;

public class UserAction extends BaseAction {

 private Userinfo user;

 private List users;

 private int userid;

 public int getUserid() {

  return userid;

 }

 public void setUserid(int userid) {

  this.userid = userid;

 }

 public Userinfo getUser() {

  return user;

 }

 public void setUser(Userinfo user) {

  this.user = user;

 }

 public String readyUpdate() throws Exception{

  user=this.getRuleDAO().getUserDAo().getUserById(userid);

  if(user!=null){

   return SUCCESS;

  }

  return INPUT;

 }

 public String login() throws Exception{

  if(this.getRuleDAO().getUserDAo().checkUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return SUCCESS;

  }

  return INPUT;

 }

 public String updateUser() throws Exception{

  if(this.getRuleDAO().getUserDAo().updateUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return SUCCESS;

  }

  return INPUT;

 }

 @Override

 public String execute() throws Exception {

  // TODO Auto-generated method stub

  return super.execute();

 }

 public List getUsers() {

  return users;

 }

 public void setUsrs(List users) {

  this.users = users;

 }

 

}

红体为新增契约方法,注意在修改成功后,需要由users数据成员获取最新的用户列表,然后显示出来

当修改编号为1的用户时,将密码修改为888888

 

修改后显示最新结果的用户列表:

 

修改完成!!!

好了,完成了查询、修改,现在开始做删除操作,非常的简单!

在用户列表中,每条记录都有一个“delete”超链接,点击可以完成对当前记录的删除。同样,删除超链接用到了<s:url>标签,用来请求相应的控制器,并传递参数,参数值当然为当前记录的主键编号,名称为userid。如下:

<a href='<s:url value="userDelete.action"><s:param value="userid"/></s:url>'>delete</a>

此时需要配置userDelete.action控制器,配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>

 <include file="struts-default.xml"/>

 <package extends="struts-default">

  <action method="login">

   <result>userList.jsp</result>

   <result >login.jsp</result>

  </action>

  <action method="readyUpdate">

   <result>userUpdate.jsp</result>

   <result >error.jsp</result>

  </action>

  <action method="updateUser">

   <result>userList.jsp</result>

   <result >error.jsp</result>

  </action>

  <action method="deleteUser">

   <result>userList.jsp</result>

   <result >error.jsp</result>

  </action>

 </package>

</struts>

新配置的控制器同样对应UserAction,此控制器的契约方法为deleteUser,显示需要在UserAction中增加一个deleteUser方法,此方法调用业务类UserDAo中的deleteUser方法完成对当前用户数据的删除,所以需要在业务类UserDAo中增加deleteUser方法,方法如下:

 public boolean deleteUser(Userinfo user){

  try{

   hibernateTemplate.delete(user);

   return true;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

UserAction中的契约方法deleteUser如下:

 public String deleteUser() throws Exception{

  Userinfo user=this.getRuleDAO().getUserDAo().getUserById(userid);

  if(this.getRuleDAO().getUserDAo().deleteUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return SUCCESS;

  }

  return INPUT;

 }

删除前如下:

点击第二条记录的“delete”,删除记录后结果如下:

删除成功!!!

现在可以开始做增加操作了,首先修改userList.jsp,在其中增加进行超链接,转发到增加页面userAdd.jsp,修改后如下:(很简单)

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'userList.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>

    <table width="80%" border="1">

     <thead>

      <tr>

       <th width="20%">UserId</th>

       <th width="20%">UserName</th>

       <th width="20%">Password</th>

        <th width="20%">Update</th>

       <th width="20%">Delete</th>     

      </tr>

     </thead>

     <s:iterator value="users">

     <tr>

      <td width="20%"> <s:property value="userid"/></td>

      <td width="20%"> <s:property value="username"/></td>

      <td width="20%"> <s:property value="password"/></td>

      <td width="20%"> <a href='<s:url value="userEdit.action"><s:param value="userid"/></s:url>'>update</a></td>

      <td width="20%"> <a href='<s:url value="userDelete.action"><s:param value="userid"/></s:url>'>delete</a></td>                       

                       

     </tr>

     </s:iterator>

    </table>

    <br>

    <a href="userAdd.jsp">Add New User</a>

  </body>

</html>

userAdd.jsp使用户增加数据,然后请求控制器进行增加操作,注意因为userid为自增字段,不用输入,页面代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'userAdd.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>Add New User</h1><br>

    <s:form action="userAdd.action">

     <s:textfield label="UserName:"/><br>

     <s:textfield label="Password:"/><br>

     <s:submit/>

    </s:form>

  </body>

</html>

此时增加控制器映射为userAdd.action,所以需要进行配置,控制器中利用新的契约方法insertUser进行处理,此契约方法调用业务类UserDAo中行增的insertUser方法进行实际的持久化操作

UserDAo中新增方法如下:

 public boolean insertUser(Userinfo user){

  try{

   hibernateTemplate.save(user);

   return true;

  }catch(HibernateException ex){

   ex.printStackTrace();

   return false;

  }

 }

UserAction中新契约方法如下:

 public String insertUser() throws Exception{

  if(this.getRuleDAO().getUserDAo().insertUser(user)){

   users=this.getRuleDAO().getUserDAo().getAllUsers();

   return

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics