以药品表(drug)为例,记录一下struts2框架实现连接数据库,进行数据库的增删改查,连接数据库部分见前一篇博客
使用mysql数据库,drug表结构设计如下图:
struts2是基于mvc的设计模式,实现模型、视图和控制器分离,各司其职。我的设计是先将实体数据封装到实体类中(模型),通过jsp页面进行人机交互(视图),由过滤器实现控制(控制器)。
package struts2.model;
public class drug {
private String id_drug;
private String name_drug;
private String type_drug;
private String effect;
private String specification;
private String price_purchase;
private String price;
private String date_manufacture;
private String date_expiry;
private String place_origin;
private String name_manufactor;
public String getId_drug() {
return id_drug;
}
public void setId_drug(String id_drug) {
this.id_drug = id_drug;
}
public String getName_drug() {
return name_drug;
}
public void setName_drug(String name_drug) {
this.name_drug = name_drug;
}
public String getType_drug() {
return type_drug;
}
public void setType_drug(String type_drug) {
this.type_drug = type_drug;
}
public String getEffect() {
return effect;
}
public void setEffect(String effect) {
this.effect = effect;
}
public String getSpecification() {
return specification;
}
public void setSpecification(String specification) {
this.specification = specification;
}
public String getPrice_purchase() {
return price_purchase;
}
public void setPrice_purchase(String price_purchase) {
this.price_purchase = price_purchase;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getDate_manufacture() {
return date_manufacture;
}
public void setDate_manufacture(String date_manufacture) {
this.date_manufacture = date_manufacture;
}
public String getDate_expiry() {
return date_expiry;
}
public void setDate_expiry(String date_expiry) {
this.date_expiry = date_expiry;
}
public String getPlace_origin() {
return place_origin;
}
public void setPlace_origin(String place_origin) {
this.place_origin = place_origin;
}
public String getName_manufactor() {
return name_manufactor;
}
public void setName_manufactor(String name_manufactor) {
this.name_manufactor = name_manufactor;
}
}
添加药品
新增药品信息
public class DrugAction extends ActionSupport implements ModelDriven{
private static final long serialVersionUID = 1L;
private drug dr=new drug();
public drug getModel() {
return dr;
}
private DButil db=new DButil();
public String drugAdd() {
int result=0;
String sql="insert into drug values(?,?,?,?,?,?,?,?,?,?,?)";
String[] params= {null,dr.getName_drug(),dr.getType_drug(),dr.getEffect(),
dr.getSpecification(),dr.getPrice_purchase(),dr.getPrice(),
dr.getDate_manufacture(),dr.getDate_expiry(),dr.getPlace_origin(),
dr.getName_manufactor()};
result=db.update(sql, params);
if(result==1)
return "success";
else
return "error";
}
从jsp页面接受数据并封装到实体类对象中,连接数据进行添加操作,添加成功,即可返回success
/success.jsp
/error.jsp
action名随意,但是可以根据方法来命名,class是该action的全路径,method是调用该action的方法,默认是execute(也可以重写)
result是返回的页面,根据调用方法的返回值配置不同的jsp页面
基本步骤和前边一样,这里只说控制器部分。查询也分为两种,一种是查询实体类对象的属性参数值(例如查询某药品的信息);还有一种是查询对象数组(例如查询所有的药品列表)
public String drugCheck() {
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
String sql="select * from drug where id_drug=?";
String[] params= {request.getParameter("id_drug")};
Map dr=null;
dr=db.getMap(sql, params);
try {
if(dr!=null) {
stack.set("drug", dr);
return “success”;
}
else
return "error";
}catch (Exception e) {
e.printStackTrace();
return "error";
}
}
这里说明一下,struts2无request对象,需要先获取request对象才能使用,刚看到截图没截到这部分HttpServletRequest request=ServletActionCOntext.getRequest();
下一步是将查询到的数据在jsp页面中显示出来,这里用到了struts2的标签
<%@ taglib uri="/struts-tags" prefix="s"%>
然后使用
传递参数
public class DrugAction extends ActionSupport implements ModelDriven{
private static final long serialVersionUID = 1L;
private ArrayList list=new ArrayList();
public ArrayList getList() {
return list;
}
private DButil db=new DButil();
public String drugFindAll() {
String sql="select * from drug";
list=(ArrayList)db.getList(sql, null);
try {
if(list!=null) {
return page;
}
else
return "error";
}catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}
在jsp页面接收显示数据可以用
先查询数据,然后从jsp页面输入要修改的值,链接数据库进行修改。这里有一个问题,查询时执行的操作action完全可以使用上一个,但方便区分可以在跳转到action时添加一个标记,当从修改页面跳到查询action的,他就会跳转到修改页面,否则会跳转到查询页面,部分代码如下:
public String drugEdit() {
int result=0;
String sql="update drug set specification=?,date_manufacture=?,"
+ "date_expiry=?,price_purchase=?,price=?,place_origin=?,name_manufactor=? where id_drug=?";
String[] params= {dr.getSpecification(),dr.getDate_manufacture(),
dr.getDate_expiry(),dr.getPrice_purchase(),dr.getPrice(),
dr.getPlace_origin(),dr.getName_manufactor(),request.getParameter("id_drug")};
result=db.update(sql, params);
if(result==1)
return "success";
else
return "error";
}
这里再jsp页面可以有一个小设计,在跳转之前(执行删除操作之前)先提醒(确定要删除吗)" on Click="return confirm('确定要删除吗')">删除药品
删除部分的action代码如下:
public String drugDelete() {
int result=0;
String sql="delete from drug where id_drug=?";
String[] params= {request.getParameter("id_drug")};
result=db.update(sql, params);
if(result==1)
return "success";
else
return "error";
}
到这里就完成基本的增删改查操作啦,别忘了每个action都要配置到struts.xml中,因为这篇文章是后来补的,所以我也忘记了当初报过哪些错了,不过总之也没有很难的地方,所以这次没有我遇到的问题模块了