您的位置:首页 > 编程语言 > Java开发

Java持久性API(JPA)第4讲——删除和修改.doc

2007-05-29 14:16 393 查看
Java持久性API(JPA)——删除和修改
目标:使用JPA完成删除和修改功能。
主要内容包括:
u 根据主键查询
u 删除信息
u 修改信息
因为删除功能和修改功能都是对已有的实体进行操作,通常需要先得到实体,然后对实体进行操作,得到实体需要根据主键进行查询。所以在介绍删除和修改信息之前先介绍如何根据主键查询。
1、根据主键查询
在第3次课中介绍了使用Query查询信息。如果使用上次课介绍的方法也可以完成根据主键的查询。但是,因为根据主键的查询比较特殊,所在JPA中提供了特殊的处理方式。下面通过实例介绍如何根据主键进行查询。
例:根据用户ID查询用户信息,假设用户ID使用字符串变量“userid”表示,用户信息对应的实体类是Userinfo,该实体类就是前3次课中使用的实体类。
Userinfo user = em.find(Userinfo.class,userid);
方法的第一个参数是实体类,第二个参数是查询的主键,返回值是查询到的实体。如果实体不存在返回null。
具体用法在后面的例子中介绍。
2、删除信息
信息删除通常是在查询的基础上,选择要删除的信息,然后删除。信息删除的基本过程如下:
n 用户选择要删除的用户;
n 控制器介绍到请求之后,调用业务模型完成删除。
根据以上过程,需要编写3个文件:
n 模型部分,在会话Bean中添加“删除用户”的方法;
n 在用户列表界面userlist.jsp添加“删除”超链;
n 编写控制器DeleteUserServlet.java,完成删除功能的控制。
操作过程如下:
1) 在会话Bean中添加“删除用户”的方法
首先,需要在业务接口中声明,在UserManagerRemote.java中添加如下方法声明:
public void deleteUser(String userid);
然后,在Bean类中实现方法,在UserManagerBean.java中添加如下代码:
// 根据主键删除用户
public void deleteUser(String userid){
Userinfo user = em.find(Userinfo.class,userid);
em.remove(user);
}
首先使用EntityManager对象em的find方法查找到实体,第一个参数是实体的类型,第二个参数是要查找的实体的主键。然后调用EntityManager的remove方法删除实体。
与直接使用JDBC完成删除相比要简单。
2)在userlist.jsp中添加删除超链
修改<c:forEach>中的代码,红色部分是添加的代码:
<c:forEach varStatus="status" var="user" items="${userlist}">
<tr>
<td>${status.index+1}</td>
<td>${user.userid}</td>
<td>${user.username}</td>
<td>
<c:if test="${user.usertype==/"0/"}">
普通用户
</c:if>
<c:if test="${user.usertype==/"1/"}">
管理员
</c:if>
</td>
<td>
<a href="DeleteUserServlet?userid=${user.userid}">删除</a>
</td>
</tr>
</c:forEach>
因为在删除的时候需要根据主键进行删除,需要传递当前用户的userid,这里使用问号+参数的形式。也可以使用按钮来实现,如果使用按钮,可以使用隐藏域传递需要删除的信息的userid。
3)编写用于删除的控制器DeleteUserServlet.java
该控制器完成的主要功能如下:
n 获取用户选择的userid;
n 调用会话Bean的deleteUser方法完成删除;
n 跳转到显示用户信息的Servlet:FindAllUserServlet。
参考代码如下(红色部分是使用向导之后生成的代码):
/*
* DeleteUserServlet.java
*
* Created on 2007年5月28日, 上午3:21
*/

package jpa.web;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
/**
*
* @author Administrator
* @version
*/
public class DeleteUserServlet extends HttpServlet {
@EJB
UserManagerRemote user;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取要删除的用户ID
String userid = request.getParameter("userid");

// 调用删除用户的方法
user.deleteUser(userid);

// 专向用户列表界面
RequestDispatcher rd = request.getRequestDispatcher("FindAllUserServlet");
rd.forward(request,response);
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>

}
4)部署、测试
3、修改信息
下面以用户信息修改为例介绍信息修改,修改信息的基本过程如下:
n 选择要修改信息的用户;
n 把要修改的用户信息显示在表单元素中;
n 用户根据需要修改信息,然后提交;
n 对用户提交的信息进行修改。
涉及两个过程:根据用户的选择,显示要修改的用户的信息;用户修改之后提交给服务器处理。
使用MVC模式,分别进行设计:
n 首先,考虑模型部分,模型部分包括两个功能:
u 根据userid查询用户信息;
u 修改用户信息
n 其次,是视图部分:
u 选择要修改的用户;
u 先是要修改的用户信息,并在此界面上修改;
u 修改后专向用户列表界面。
n 最后是控制器,包括两部分:
u 根据userid查询用户信息的控制器;
u 使用用户输入的信息进行。
下面分别介绍。
1) 在会话Bean中添加业务方法
首先在业务接口中声明方法,包括根据userid查询用户的方法和修改用户信息的方法,方法的的定义如下:
public Userinfo findUserById(String userid);
public void updateUser(String userid,String username,String userpass,char usertype);
在Bean类中实现这两个方法,方法的参考代码如下:
// 根据主键查询用户
public Userinfo findUserById(String userid){
return em.find(Userinfo.class,userid);
}
// 更新用户
public void updateUser(String userid,String username,String userpass,char usertype){
Userinfo user=em.find(Userinfo.class,userid);
user.setUsername(username);
user.setUserpass(userpass);
user.setUsertype(usertype);
}
根据主键查询用户信息的代码前面介绍过。更新用户,需要先查找到该用户,根据主键查找,之后使用set方法进行修改。上面的方法就完成了信息的修改。
2)在用户列表界面userlist.jsp上添加“修改”超链,修改<c:forEach>中的代码,修改后的代码如下(红色部分是添加的):
<c:forEach varStatus="status" var="user" items="${userlist}">
<tr>
<td>${status.index+1}</td>
<td>${user.userid}</td>
<td>${user.username}</td>
<td>
<c:if test="${user.usertype==/"0/"}">
普通用户
</c:if>
<c:if test="${user.usertype==/"1/"}">
管理员
</c:if>
</td>
<td>
<a href="DeleteUserServlet?userid=${user.userid}">删除</a>
</td>
<td>
<a href="FindUserByIdServlet?userid=${user.userid}">修改</a>
</td>
</tr>
</c:forEach>
3)编写根据主键查询用户信息的控制器FindUserByIdServlet.java,参考代码如下(红色部分是使用向导之后添加的代码):
/*
* FindUserByIdServlet.java
*
* Created on 2007年5月28日, 上午3:21
*/

package jpa.web;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
import jpa.Userinfo;

/**
*
* @author Administrator
* @version
*/
public class FindUserByIdServlet extends HttpServlet {
@EJB
UserManagerRemote user;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取要修改的用户的ID
String userid = request.getParameter("userid");

// 调用根据主键查询用户的方法
Userinfo userinfo = user.findUserById(userid);

// 保存到request中,传递到页面
request.setAttribute("userinfo",userinfo);

// 转向修改界面
RequestDispatcher rd = request.getRequestDispatcher("updateUser.jsp");
rd.forward(request,response);
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
4)编写修改界面updateUser.jsp,在查询到信息之后会跳转到信息修改界面,信息修改界面的参考代码如下:
<%@page contentType="text/html"%>
<%@page pageEncoding="gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>

<h1>JSP Page</h1>
<form action="UpdateUserServlet" method="POST">
用户ID:${userinfo.userid}
<input type="hidden" name="userid" value="${userinfo.userid}" /><br>
用户名:<input type="text" name="username" value="${userinfo.username}" /><br>
口令:<input type="password" name="userpass" value="${userinfo.userpass}" /><br>
权限:<select name="usertype">
<option value="0" <c:if test="${userinfo.usertype=='0'}">
selected</c:if>>普通用户</option>
<option value="1" <c:if test="${userinfo.usertype=='1'}">
selected</c:if>>管理员</option>
</select><br>
<input type="submit" value="修改" /><input type="reset" value="重置" />
</form>

</body>
</html>
代码解释:
n 用户ID不能修改,但是修改信息的时候需要根据ID修改,所以使用隐藏域传递。
n 使用表达式语言,通过value对输入框赋值。
n 对于下拉框稍微复杂一些:使用<c:if>判断,然后确定选择哪一个。
5)编写修改的控制器:UpdateUserServlet.java,代码如下(红色部分是使用向导生成之后添加的代码):
/*
* UpdateUserServlet.java
*
* Created on 2007年5月28日, 上午3:23
*/

package jpa.web;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;

/**
*
* @author Administrator
* @version
*/
public class UpdateUserServlet extends HttpServlet {
@EJB
UserManagerRemote user;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取修改后的信息
String userid = request.getParameter("userid");
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
String usertype = request.getParameter("usertype");

// 调用修改信息的方法
user.updateUser(userid,username,userpass,usertype.charAt(0));

// 专向用户列表界面
response.sendRedirect("FindAllUserServlet");
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
代码比较简单,不再解释。
4、小结
信息的修改和删除,通常都是先查找到实体,根据主键查询,使用EntityManager的find方法,第1个参数是要查找的实体类,第2个参数是要查找的实体类的主键。
信息的删除,通常先查找到实体,然后调用EntityManager的remove方法删除,参数是要删除的实体。
信息的修改,通常先查找到实体,然后调用实体的set方法进行修改。
关于EntityManager的方法参考书上357页。


更多内容参考:《Java EE 5实用教程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: