« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
公告 |
我近期在研究Maven、Turbine、EJB,如果有朋友想一起交流学习,请加我的MSN:moshco_zhu@hotmail.com!
你为什么来,你何必来,叫我怎么见你!
--《小城之春》 |
| 
|
本站首页 管理页面 写新日志 退出
[01 技术文档]在Weblogic 10中做EJB3的开发 之基础开发 (6) |
在Weblogic 10中做EJB3的开发 之基础开发 (6)
---------------------------------------------------------------------------
5.访问EJB3
我们常用于访问EJB的可能有如下几种: 1.EJB调用远程或本地JVM的EJB; 2.Servlet访问远程或本地JVM的EJB; 3.普通Java类也可以调用远程JVM的EJB; 注意:这里的远程不一定是另外一台电脑。同一台电脑,如果一个是weblogic服务器,一个是运行中的普通Java类,它们也不是在同一个JVM中。
weblogic server中,EJB3提供的访问方式有: 1.使用标签配置JNDI,然后使用这个JNDI访问EJB对象; 2.在同一个JVM中,使用依赖注入的方式访问本地容器中的EJB对象; 3.在配置文件中引用EJB,然后使用JNDI访问。
下面我对各种访问方式分别做一个例子。
5.1 使用标签配置JNDI,然后使用这个JNDI访问EJB对象
这种访问方式是EJB3最明显的特性。正是因为大量使用标签,EJB3的开发才大大降低了繁琐度、难度,使开发一个EJB变得十分简单和有趣。
下面我们设想一种业务需求来完成这种访问方式的演示。 需求:用户账户有多条资金交易记录,现在把它查询列表显示,并提供每条记录的明细。 设计:设计一个EJB用来操作用户账户交易记录,实现两个功能:模糊查询显示列表,根据ID查询显示详细; 观察:EJB的JNDI采用标签配置。
第一要做的是创建数据库表,我是在MySQL中实现的,表的数据结构如下: 表名:[traderecord] ---------------------------------------------------------------------- 字段 数据类型 编码类型 可否为空 默认值 自动增加 描述 ---------------------------------------------------------------------- Id int(11) 否 auto_increment 记录编号 TradeType varchar(32) gbk_bin 否 业务类型 TimeBegin datetime 否 开始时间 GoodsName varchar(256) gbk_bin 是 NULL 货品名称 GoodsInfo varchar(1024) gbk_bin 是 NULL 货品信息 Money float 是 NULL 总金额 MoneyInfo varbinary(1024) 否 金额信息 TradePoint varchar(8) gbk_bin 否 交易方向 User varbinary(64) 否 用户 Comrade varchar(64) gbk_bin 是 NULL 交易伙伴 State varchar(8) gbk_bin 否 状态 Remark varchar(1024) gbk_bin 是 NULL 备注 ----------------------------------------------------------------------
我们创建两个业务Java Bean的类,这两个Bean类的主要作用是封装数据,数据格式标准化转换,这两个Java Bean类是继承一个基础Java Bean类。
基础Java Bean类。 文件地址:[Java/JavaSource/com/mh/javabean/CommondBean.java] 包路径:[com.mh.javabean] 名称:[CommondBean] ---------------------------------------------------------------------- /** * */ package com.mh.javabean;
import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
/** * @author moshco zhu * */ @SuppressWarnings("serial") public class CommondBean implements Serializable {
/** * @描述:将Bean数组转化为XML字符串 * @param bean * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ public static String toXML(CommondBean[] aBean) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
// 定义变量 String strResult = "";
// Bean数组对象不能为空 if (aBean == null) { return ""; }
// xml头字符串 strResult += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; strResult += "<beans name=\"TradeRecordList\">\n"; // 逐一处理数组中每一个Bean对象 for (int i = 0; i < aBean.length; i++) { // 获取Bean对象 CommondBean bean = aBean[i]; strResult += bean.getBeanXML(); } strResult += "</beans>";
// 返回函数值 return strResult; }
/** * @描述:将Bean对象转换为XML字符串 * @param bean * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ public static String toXML(CommondBean bean) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
// 定义变量 String strResult = "";
// Bean数组对象不能为空 if (bean == null) { return ""; }
// xml头字符串 strResult += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; strResult += "<beans name=\"TradeRecordList\">\n"; // 获取Bean对象 strResult += bean.getBeanXML(); strResult += "</beans>";
// 返回函数值 return strResult; }
/** * @描述:获取Bean的XML字符串 * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ public String getBeanXML() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
// 定义变量 String strResult = "";
// 获取Bean对象的字段数组 Field[] aFld = this.getClass().getDeclaredFields(); if (aFld == null || aFld.length == 0) { return ""; }
// 获取Bean对象的方法数组 Method[] aMth = this.getClass().getDeclaredMethods(); if (aMth == null || aMth.length == 0) { return ""; }
// 开始组合:执行每一个有get方法、set方法的字段 for (int i = 0; i < aFld.length; i++) {
// 获取字段的名称 String strFildName = aFld[i].getName(); String strNameGet = ("get" + strFildName).toLowerCase(); String strNameSet = ("set" + strFildName).toLowerCase();
// 寻找get、set方法的标识 boolean bGet = false; boolean bSet = false;
// Get方法的位置 int iGet = -1;
// 搜索所有的方法 for (int j = 0; j < aMth.length; j++) { // 匹配Get方法 if (strNameGet.equals(aMth[j].getName().toLowerCase())) { bGet = true; iGet = j; } // 匹配Set方法 if (strNameSet.equals(aMth[j].getName().toLowerCase())) { bSet = true; } if (bGet && bSet) { break; } }
// 组合XML字符串 if (bGet && bSet && iGet >= 0) { strResult += "\t\t<field name=\"" + strFildName + "\">"; Object[] aO = null; Object oResult = aMth[iGet].invoke(this, aO); if (oResult != null) { strResult += oResult.toString(); } strResult += "</field>\n"; } } if(strResult != null && strResult.length() > 0){ strResult = "\t<bean>\n"+strResult+ "\t</bean>\n"; }
// 返回函数值 return strResult; }
} ---------------------------------------------------------------------- 这个Bean类的作用,主要是将Bean类数据转换为XML字符串。它是一个Bean类的基础类,可以在这个类里面扩展一些JavaBean公用和基础的功能。 这里我们主要实现了三个功能: public static String toXML(CommondBean[] aBean):将Bean对象数组转换为标准的XML文件格式字符串; public static String toXML(CommondBean bean):将Bean对象转换为标准的XML文件格式字符串; public String getBeanXML():将Bean本自己转换为标准XML字符串。
第一个Java Bean类。 文件地址:[Java/JavaSource/com/mh/ejb3/test/javabean/TradeRecord.java] 包路径:[com.mh.ejb3.test.javabean] 名称:[TradeRecord] 具体内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.javabean;
import java.io.Serializable; import java.sql.Timestamp;
import com.mh.javabean.CommondBean;
/** * @author moshco zhu * */ @SuppressWarnings("serial") public class TradeRecord extends CommondBean {
private int Id = -1;
private String TradeType = null;
private Timestamp TimeBegin = null;
private String GoodsName = null;
private String GoodsInfo = null;
private String Money = null;
private String MoneyInfo = null;
private String TradePoint = null;
private String User = null;
private String Comrade = null;
private String State = null;
private String Remark = null;
/** * @return remark */ public String getRemark() { return Remark; }
/** * @param remark * 要设置的 remark */ public void setRemark(String remark) { Remark = remark; }
/** * @return comrade */ public String getComrade() { return Comrade; }
/** * @param comrade * 要设置的 comrade */ public void setComrade(String comrade) { Comrade = comrade; }
/** * @return goodsInfo */ public String getGoodsInfo() { return GoodsInfo; }
/** * @param goodsInfo * 要设置的 goodsInfo */ public void setGoodsInfo(String goodsInfo) { GoodsInfo = goodsInfo; }
/** * @return goodsName */ public String getGoodsName() { return GoodsName; }
/** * @param goodsName * 要设置的 goodsName */ public void setGoodsName(String goodsName) { GoodsName = goodsName; }
/** * @return id */ public int getId() { return Id; }
/** * @param id * 要设置的 id */ public void setId(int id) { Id = id; }
/** * @return money */ public String getMoney() { return Money; }
/** * @param money * 要设置的 money */ public void setMoney(String money) { Money = money; }
/** * @return moneyInfo */ public String getMoneyInfo() { return MoneyInfo; }
/** * @param moneyInfo * 要设置的 moneyInfo */ public void setMoneyInfo(String moneyInfo) { MoneyInfo = moneyInfo; }
/** * @return state */ public String getState() { return State; }
/** * @param state * 要设置的 state */ public void setState(String state) { State = state; }
/** * @return timeBegin */ public Timestamp getTimeBegin() { return TimeBegin; }
/** * @param timeBegin * 要设置的 timeBegin */ public void setTimeBegin(Timestamp timeBegin) { TimeBegin = timeBegin; }
/** * @return tradePoint */ public String getTradePoint() { return TradePoint; }
/** * @param tradePoint * 要设置的 tradePoint */ public void setTradePoint(String tradePoint) { TradePoint = tradePoint; }
/** * @return tradeType */ public String getTradeType() { return TradeType; }
/** * @param tradeType * 要设置的 tradeType */ public void setTradeType(String tradeType) { TradeType = tradeType; }
/** * @return user */ public String getUser() { return User; }
/** * @param user * 要设置的 user */ public void setUser(String user) { User = user; }
} ---------------------------------------------------------------------- TradeRecord类的主要作用是封装交易记录完整信息。
第二个Java Bean类。 文件地址:[Java/JavaSource/com/mh/ejb3/test/javabean/TradeRecordList.java] 包路径:[com.mh.ejb3.test.javabean] 名称:[TradeRecordList] 具体内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.javabean;
import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Timestamp;
import com.mh.javabean.CommondBean;
/** * @author moshco zhu * */ @SuppressWarnings("serial") public class TradeRecordList extends CommondBean{
private int Id = -1;
private String TradeType = null;
private Timestamp TimeBegin = null;
private String GoodsName = null;
private String Money = null;
private String TradePoint = null;
private String Comrade = null;
private String State = null;
/** * @return comrade */ public String getComrade() { return Comrade; }
/** * @param comrade * 要设置的 comrade */ public void setComrade(String comrade) { Comrade = comrade; }
/** * @return goodsName */ public String getGoodsName() { return GoodsName; }
/** * @param goodsName * 要设置的 goodsName */ public void setGoodsName(String goodsName) { GoodsName = goodsName; }
/** * @return id */ public int getId() { return Id; }
/** * @param id * 要设置的 id */ public void setId(int id) { Id = id; }
/** * @return money */ public String getMoney() { return Money; }
/** * @param money * 要设置的 money */ public void setMoney(String money) { Money = money; }
/** * @return state */ public String getState() { return State; }
/** * @param state * 要设置的 state */ public void setState(String state) { State = state; }
/** * @return timeBegin */ public Timestamp getTimeBegin() { return TimeBegin; }
/** * @param timeBegin * 要设置的 timeBegin */ public void setTimeBegin(Timestamp timeBegin) { TimeBegin = timeBegin; }
/** * @return tradePoint */ public String getTradePoint() { return TradePoint; }
/** * @param tradePoint * 要设置的 tradePoint */ public void setTradePoint(String tradePoint) { TradePoint = tradePoint; }
/** * @return tradeType */ public String getTradeType() { return TradeType; }
/** * @param tradeType * 要设置的 tradeType */ public void setTradeType(String tradeType) { TradeType = tradeType; }
} ---------------------------------------------------------------------- TradeRecordList类的作用主要是封装交易记录用来列表显示的信息。
到这里已经完成了数据模型的创建,接下来创建数据操作层DAO类。
创建DAO类。 文件地址:[Java/JavaSource/com/mh/dao/test/TradeRecordDAO.java] 包名:[com.mh.dao.test] 名称:[TradeRecordDAO] 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.dao.test;
import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;
import javax.sql.DataSource;
import com.mh.ejb3.test.javabean.TradeRecord; import com.mh.ejb3.test.javabean.TradeRecordList; import com.mh.util.DSUtil;
/** * @author moshco zhu * */ @SuppressWarnings("serial") public class TradeRecordDAO implements Serializable {
/** * @描述:定义成员变量 * */ private DataSource ds = null;
private Connection conn = null;
/** * @描述:构造函数 * */ public TradeRecordDAO() {
// 获取数据源 try {
// 获取数据源对象 ds = DSUtil.getDSObject("mysql_ejb31"); // 获取数据库连接 conn = ds.getConnection(); } catch (Exception e) { e.printStackTrace(); }
}
/** * @描述:获取指定的Bean对象 * @param iId * @return */ public TradeRecord findTradeRecord(int iId) {
// 获取数据源 TradeRecord bean = null;
try {
// 查询数据 String strSQL = ""; strSQL += "select "; strSQL += " Id,"; strSQL += " TradeType,"; strSQL += " TimeBegin,"; strSQL += " GoodsName,"; strSQL += " GoodsInfo,"; strSQL += " Money,"; strSQL += " MoneyInfo,"; strSQL += " TradePoint,"; strSQL += " User,"; strSQL += " Comrade,"; strSQL += " State,"; strSQL += " Remark "; strSQL += "from "; strSQL += " TradeRecord "; strSQL += "where "; strSQL += " Id = ?"; PreparedStatement psta = conn.prepareStatement(strSQL); psta.setInt(1, iId); ResultSet rs = psta.executeQuery();
// 获取结果 while (rs.next()) { // 创建Bean对象 bean = new TradeRecord(); bean.setId(rs.getInt("Id")); bean.setTradeType(rs.getString("TradeType")); bean.setTimeBegin(rs.getTimestamp("TimeBegin")); bean.setGoodsName(rs.getString("GoodsName")); bean.setGoodsInfo(rs.getString("GoodsInfo")); bean.setMoney(rs.getString("Money")); bean.setMoneyInfo(rs.getString("MoneyInfo")); bean.setTradePoint(rs.getString("TradePoint")); bean.setUser(rs.getString("User")); bean.setComrade(rs.getString("Comrade")); bean.setState(rs.getString("State")); bean.setRemark(rs.getString("Remark")); // 中断 break; }
} catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null && !conn.isClosed()) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } ds = null; }
// 返回函数值 return bean; }
@SuppressWarnings("unchecked") public TradeRecordList[] queryUnsharp(String strKeyWord) {
// 获取数据源 List lstTradeRecord = new ArrayList(); TradeRecordList bean = null; TradeRecordList[] aBean = null;
try {
// 查询数据 String strSQL = ""; strSQL += "select "; strSQL += " Id,"; strSQL += " TradeType,"; strSQL += " TimeBegin,"; strSQL += " GoodsName,"; strSQL += " Money,"; strSQL += " TradePoint,"; strSQL += " Comrade,"; strSQL += " State "; strSQL += "from "; strSQL += " TradeRecord "; strSQL += "where "; strSQL += " GoodsName like concat('%',concat(?,'%'))"; strSQL += " or Comrade like concat('%',concat(?,'%'))"; PreparedStatement psta = conn.prepareStatement(strSQL); psta.setString(1, strKeyWord); psta.setString(2, strKeyWord); ResultSet rs = psta.executeQuery();
// 获取结果 while (rs.next()) { // 创建Bean对象 bean = new TradeRecordList(); bean.setId(rs.getInt("Id")); bean.setTradeType(rs.getString("TradeType")); bean.setTimeBegin(rs.getTimestamp("TimeBegin")); bean.setGoodsName(rs.getString("GoodsName")); bean.setMoney(rs.getString("Money")); bean.setTradePoint(rs.getString("TradePoint")); bean.setComrade(rs.getString("Comrade")); bean.setState(rs.getString("State")); // 加入数组 lstTradeRecord.add(bean); }
// 转换为数组 if (lstTradeRecord != null && lstTradeRecord.size() > 0) { aBean = new TradeRecordList[lstTradeRecord.size()]; aBean = (TradeRecordList[]) lstTradeRecord.toArray(aBean); }
} catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null && !conn.isClosed()) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } ds = null; }
// 返回函数值 return aBean; } }
---------------------------------------------------------------------- 这个DAO类实现的功能主要是: public TradeRecordDAO():构造函数,用来获取数据源,DSUtil类的内容在上一篇文件中已经讲过了。需要注意的是数据源JNDI[mysql_ejb31]的配置大家要根据实际情况来写。 public TradeRecord findTradeRecord(int iId):根据记录Id,查找相关Bean对象。 public TradeRecordList[] queryUnsharp(String strKeyWord):通过关键字查询所有服务要求的Bean对象列表。
下面介绍业务逻辑层的编写。
首先编写EJB。 接口类。
文件地址:[EJB3/JavaSource/com/mh/ejb3/test/labeljndi/TradeRecordManage.java] 包名:[com.mh.ejb3.test.labeljndi] 名称:[TradeRecordManage] 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.labeljndi;
import com.mh.ejb3.test.javabean.TradeRecord; import com.mh.ejb3.test.javabean.TradeRecordList;
/** * @author moshco zhu * */ public interface TradeRecordManage {
public TradeRecordList[] queryUnsharp(String strKeyWord);
public TradeRecord findTradeRecord(int iId);
} ----------------------------------------------------------------------
文件地址:[EJB3/JavaSource/com/mh/ejb3/test/labeljndi/TradeRecordManageBean.java] 包名:[com.mh.ejb3.test.labeljndi] 名称:[TradeRecordManageBean] EJB类型:无状态会话Bean 实现业务接口:远程接口 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.ejb3.test.labeljndi;
import javax.ejb.Remote; import javax.ejb.Stateless;
import com.mh.dao.test.TradeRecordDAO; import com.mh.ejb3.test.javabean.TradeRecord; import com.mh.ejb3.test.javabean.TradeRecordList;
/** * @author moshco zhu * */ @Stateless(mappedName = "TradeRecordManageBean") @Remote(TradeRecordManage.class) public class TradeRecordManageBean implements TradeRecordManage {
/* * (非 Javadoc) * * @see com.mh.ejb3.test.labeljndi.TradeRecordManage#findTradeRecord(int) */ public TradeRecord findTradeRecord(int iId) {
// 创建DAO对象 TradeRecordDAO dao = new TradeRecordDAO();
// 实现业务操作 TradeRecord bean = dao.findTradeRecord(iId);
// 返回函数值 return bean; }
/* * (非 Javadoc) * * @see com.mh.ejb3.test.labeljndi.TradeRecordManage#queryUnsharp(java.lang.String) */ public TradeRecordList[] queryUnsharp(String strKeyWord) {
// 创建DAO对象 TradeRecordDAO dao = new TradeRecordDAO();
// 实现业务操作 TradeRecordList[] aBean = dao.queryUnsharp(strKeyWord);
// 返回函数值 return aBean; }
} ---------------------------------------------------------------------- EJB实现了两个功能:[findTradeRecord]和[findTradeRecord],一个是显示详细Bean数据,一个是显示模糊查询的列表。 需要注意的是,我们这里采用的是通过注解来定义EJB的JNDI,根据[@Stateless(mappedName = "TradeRecordManageBean")],我们可以确定JNDI应该是[TradeRecordManageBean@com.mh.ejb3.test.labeljndi.TradeRecordManage],[@]后面的部分是EJB的接口全名称。
接下来我们编写,逻辑控制层Servlet的代码。 文件地址:[WebContext/JavaSource/com/mh/servlet/test/pay/TradeRecordSV.java] 包名:[com.mh.servlet.test.pay] 名称:[TradeRecordSV] 内容如下: ---------------------------------------------------------------------- /** * */ package com.mh.servlet.test.pay;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import com.mh.ejb3.test.javabean.TradeRecord; import com.mh.ejb3.test.javabean.TradeRecordList; import com.mh.ejb3.test.labeljndi.TradeRecordManage; import com.mh.util.EJBUtil;
/** * @author moshco zhu * */ @SuppressWarnings("serial") public class TradeRecordSV extends HttpServlet {
@Override public void init() throws ServletException { // TODO 自动生成方法存根 super.init(); }
@Override public void destroy() { // TODO 自动生成方法存根 super.destroy(); }
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doWork(request, response); }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doWork(request, response); }
/** * @描述:公共处理方法 * * @param strJNDI * @return * @throws Excep */ private void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取输出对象 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 设置输出编码 response.setContentType("text/XML;charset=UTF-8"); PrintWriter out = response.getWriter(); // 结果值 String message = "Test:<br><hr size='1'>";
try {
// 获取参数 String strPara = (String) request.getParameter("dowith");
if (strPara != null && strPara.equals("queryUnsharp")) {
// 通过JNDI获取EJB对象 TradeRecordManage ejbDB = (TradeRecordManage) EJBUtil .getEJBObject("TradeRecordManageBean#com.mh.ejb3.test.labeljndi.TradeRecordManage");
// 模糊查询 String strKeyWord = request.getParameter("keyword"); TradeRecordList[] aBean = ejbDB.queryUnsharp(strKeyWord);
// Bean数组转换为XML字符串 message = TradeRecordList.toXML(aBean);
} else if (strPara != null && strPara.equals("findTradeRecord")) {
// 通过JNDI获取EJB对象 TradeRecordManage ejbDB = (TradeRecordManage) EJBUtil .getEJBObject("TradeRecordManageBean#com.mh.ejb3.test.labeljndi.TradeRecordManage");
// 查询Bean对象 int iId = Integer.parseInt(request.getParameter("id")); TradeRecord bean = ejbDB.findTradeRecord(iId);
// Bean数组转换为XML字符串 message = TradeRecord.toXML(bean);
}
} catch (Exception e) { e.printStackTrace(); message += e.toString(); } finally { }
// 输出 out.print(message); out.flush(); out.close(); }
} ---------------------------------------------------------------------- 上面的Servlet中,我们提交请求后返回的是XML标准文件字符串,主要是通过基础Bean类的[toXML]方法来转换的,之所以把他转换为XML字符串,是因为在js中可以使用不同的样式表来显示不同的样式。需要提醒一下的是,上面有一段是这样写的[response.setContentType("text/XML;charset=UTF-8");],这是在告诉Servlet返回数据类型应该是text和xml格式,如果是HTML格式应该写成:[response.setContentType("text/html;charset=UTF-8");]。
因为创建了新的Servlet,所以,我们要在[web.xml]中加以定义。 打开文件[WebContext/WEB-INF/web.xml],添加下面这段: ---------------------------------------------------------------------- <!-- 定义一个Servlet --> <servlet> <servlet-name>TradeRecordSV</servlet-name> <servlet-class> com.mh.servlet.test.pay.TradeRecordSV </servlet-class> <load-on-startup>4</load-on-startup> </servlet> <servlet-mapping> <servlet-name>TradeRecordSV</servlet-name> <url-pattern>/sv/TradeRecordSV.do</url-pattern> </servlet-mapping> ----------------------------------------------------------------------
|
阅读全文(3234) | 回复(0) | 编辑 | 精华 |
|