本实例实现了对个人信息的增删差改功能,我们可以在这里运用感到模糊查询,同时可以进行对数据的增加修改,实时显示在页面中,本实例主要过程及代码框架如下
建立DAO类
/*
* @param<T>当前Dao处理的尸体类型是什么
*
* 封装了基本的crud的方法。以供子类继承使用。
*
* 整个DAO采取DBUtils解决方案
* @param<T> 当前DAO处理的尸体类类型是什么。
* */
public class DAO<T>{
private QueryRunner queryRunner= new QueryRunner();
public Class<T> clazz;
public DAO(){
//反射視頻
Type superClass=getClass().getGenericSuperclass();
if(superClass instanceof ParameterizedType){
ParameterizedType parameterizedType=(ParameterizedType) superClass;
Type [] args=parameterizedType.getActualTypeArguments();
if(args!=null&&args.length>0){
if(args[0] instanceof Class){
clazz=(Class<T>) args[0];
}
}
}
}
/*
* 返回某个一个字段的值,例如返回某一条记录的customerName或返回数据表中有多少条记录等
* @Param sql
* @param args
* @return
* */
public <E> E getForValue(String sql,Object...args){
Connection con=null;
try{
con=JdbcUtils.getConnection();
return (E) queryRunner.query(con, sql, new ScalarHandler<>(),args);
}
catch(Exception e){
}
finally{
JdbcUtils.releaseConnection(con);
}
return null;
}
/*该方法封装了insert delete update等操作
* @param sql:sql语句
* @param args 填充sql语句占位符
*
*
* */
public void update(String sql,Object...args){
Connection con=null;
try{
con=JdbcUtils.getConnection();
queryRunner.update(con,sql,args);
}
catch(Exception e){
e.printStackTrace();
}
finally{
JdbcUtils.releaseConnection(con);
}
}
/*
* 返回对应的T的一个实体类型对象。
* */
public T get(String sql,Object...args){
Connection con=null;
try{
con=JdbcUtils.getConnection();
return queryRunner.query(con, sql, new BeanHandler<>(clazz), args);
}
catch(Exception e){
}
finally{
JdbcUtils.releaseConnection(con);
}
return null;
}
/*
* 返回T所对应的List
* @param sql
* @param args
* @return
* */
public List<T> getForList(String sql,Object...args){
Connection con=null;
try{
con=JdbcUtils.getConnection();
return (List<T>) queryRunner.query(con, sql,new BeanListHandler<>(clazz),args);
}
catch(Exception e){
}
finally{
JdbcUtils.releaseConnection(con);
}
return null;
}
}
建立一个CustomerDao接口,并编写需要实现的具体方法名称,
package com.mvcapp.dao;
import java.util.List;
import com.mvcapp.domain.Customer;
/*DAO接口封装了各种方法
*
* */
public interface CustomerDAO {
/*获取所有内容*/
public List<Customer> getAll();
public void save(Customer c);
public Customer get(Integer id);
public void delete(Integer id);
public void update(Customer customer);
/*
* 返回和name相同的记录数
* */
public long getCountWithName(String name);
public List<Customer> getForlistWithCriterCustomer(CriterCustomer c);
}
建立一个CustomerImple类继承DAO类,和实现CustomerDAO接口,
package com.mvcapp.dao.impl; import java.util.List; import com.mvcapp.dao.CriterCustomer; import com.mvcapp.dao.CustomerDAO; import com.mvcapp.dao.DAO; import com.mvcapp.domain.Customer; public class CustomerDAOJdbcImpl extends DAO<Customer> implements CustomerDAO{ @Override public List<Customer> getAll() { // TODO Auto-generated method stub String sql="select id ,name,address,phone from customers"; return getForList(sql); } @Override public void save(Customer c) { // TODO Auto-generated method stub String sql="insert into customers(name,address,phone)values(?,?,?)"; update(sql,c.getName(),c.getAddress(),c.getPhone()); } @Override public Customer get(Integer id) { // TODO Auto-generated method stub String sql="select * from customers where id=?"; return get(sql,id); } @Override public void delete(Integer id) { // TODO Auto-generated method stub String sql="delete from customers where id=?"; update(sql,id); } @Override public long getCountWithName(String name) { // TODO Auto-generated method stub String sql="select count(id) from customers where name=?"; return getForValue(sql, name); } public List<Customer> getForlistWithCriterCustomer(CriterCustomer cc) { // TODO Auto-generated method stub String sql="select id,name,address,phone from customers where name like ? and address like ? and phone like ?"; return getForList(sql,cc.getName(),cc.getAddress(),cc.getPhone()); } @Override public void update(Customer customer) { // TODO Auto-generated method stub String sql="update customers set name=?,address=?,phone=? where id=?"; System.out.println(customer.getName()); update(sql,customer.getName(),customer.getAddress(),customer.getPhone(),customer.getId()); }
package com.mvcapp.domain; public class Customer { private Integer id; private String name; private String address; private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]"; } public Customer() { super(); // TODO Auto-generated constructor stub } public Customer(String name, String address, String phone) { super(); this.name = name; this.address = address; this.phone = phone; } }
} 建立一个Customer类,前提是要有一个Customer数据表,通过将该类的属性和字段名称相同,我们并且实现这些属性的getset方法建立一个构造函数,可以在后边程序中通过实例话的方法进行实例,
package com.mvcapp.domain; public class Customer { private Integer id; private String name; private String address; private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]"; } public Customer() { super(); // TODO Auto-generated constructor stub } public Customer(String name, String address, String phone) { super(); this.name = name; this.address = address;
package com.mvcapp.domain; public class Customer { private Integer id; private String name; private String address; private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]"; } public Customer() { super(); // TODO Auto-generated constructor stub } public Customer(String name, String address, String phone) { super(); this.name = name; this.address = address; this.phone = phone; } }
this.phone = phone;}} 建立一个Servlet。我们可以在其中使用多个请求对应一个 Servlet。这样可以提高项目的运行效率,我们可以通过使用如下的方式来完成该效果具体代码如下
package com.mvcapp.servlet; import java.io.IOException; import java.lang.reflect.Method; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mvcapp.dao.CriterCustomer; import com.mvcapp.dao.CustomerDAO; import com.mvcapp.dao.impl.CustomerDAOJdbcImpl; import com.mvcapp.domain.Customer; public class CustomerServlet extends HttpServlet { private CustomerDAO customerDao=new CustomerDAOJdbcImpl(); /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request * the request send by the client to the server * @param response * the response send by the server to the client * @throws ServletException * if an error occurred * @throws IOException * if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /* * public void doPost(HttpServletRequest request, HttpServletResponse * response) throws ServletException, IOException { String * method=request.getParameter("method"); switch(method){ case * "add":add(request,response);break; case "query": * query(request,response);break; case "delete": * delete(request,response);break; } */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String servletPath = request.getServletPath(); String methodName = servletPath.substring(1); methodName = methodName.substring(0, methodName.length() - 3); System.out.println(methodName); try { Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);//利用反射获取methodName对应的方法 method.invoke(this, request, response);//调用相对应的方法(前提是声明的方法要和反射的结果字符串相同,这样可以更好的匹配) } catch (Exception a) { // TODO Auto-generated catch block a.printStackTrace(); response.sendRedirect("error.jsp"); } } private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("delete method"); int id=Integer.valueOf(request.getParameter("id")); customerDao.delete(id); List<Customer> deleteafterlist=customerDao.getAll(); request.setAttribute("listall",deleteafterlist); request.getRequestDispatcher("index.jsp").forward(request, response); } private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("query method"); String name=request.getParameter("name"); String address=request.getParameter("address"); String phone=request.getParameter("phone"); CriterCustomer cru=new CriterCustomer(name, address, phone); //1.直接调用CustomerDao方法得到Customer集合 List<Customer> listcustoerm=customerDao.getForlistWithCriterCustomer(cru); //2.把Customer集合放入 request中。 request.setAttribute("listall",listcustoerm); //3.利用请求转发的方式 request.getRequestDispatcher("/index.jsp").forward(request, response); } private void addCustomer(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("utf-8"); //1.获取参数 System.out.println("addcustomer method"); String username=request.getParameter("name"); String address=request.getParameter("address"); String phone=request.getParameter("phone"); //2.检查name是否被占用。 //2.1调用CustomeRoa的getCountWithName(String name)获取name在数据库中是否存在 long count=customerDao.getCountWithName(username); //通过转发的方式来响应,newcustomer.jsp页面显示一个错误消息:用户名name已经被占用,请重新选择 //2.2若返回值大于零,则响应newCutomer.jsp的值。 if(count>0){ System.out.println("获取到的用户名为"+username+"其数量为"+count); //2.2.1要求在newcustomer.jsp页面显示一个错误消息(用户名name已经被占用,请重新选择!) //request中放入一个属性message:用户名name已经被占用,在页面通过request.getAttribute("message")的方式来显示 //2.2.2newCustomer.jsp的表单值要回显。 request.setAttribute("message", "用户名"+username+"被占用请重新选择"); request.getRequestDispatcher("newcustomer.jsp").forward(request, response); //通过如下方式进行回显 // <td><input type="text" name="name" value="<%=request.getParameter("name")==null?"":request.getParameter("name")%>"></td> return ; } //2.2.3、结束方法 return //把表单参数封装成一个Customer对象的customer //2.3调用CustomerDao的save(Customer customer)执行保存操作 Customer cu=new Customer(username,address,phone); customerDao.save(cu); response.sendRedirect("success.jsp"); } private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("update method"); //1.获取表单参数id name address,phone,oldName String id=request.getParameter("id"); int ida=-1; String name=request.getParameter("name"); String phone=request.getParameter("phone"); String oldName=request.getParameter("oldName"); String address=request.getParameter("address"); System.out.println("获取的参数"+name+phone+oldName+address); //2.检验name是否被占用 //2.1比较name和oldName是否可用,若不相同,则调用CustomerDao的getCountWithName(String name)获取name在数据库中是否存在。 if(!oldName.equals(name)){ long count=customerDao.getCountWithName(name); //2.2若返回的值大于0,则相应updateCustomer.jsp页面显示一个错误信息,用户名name已经被占用,请重新选择 if(count>0){ //2.2.1在updateCustomer.jsp页面显示一个错误消息,用户名name已经被占用,请重新选择, //在request中放入一个属性message:用户名name已经被占用,请重新选择! //在页面上通过 request.getAttribute("message")的方式显示 //2.2.2newcustomer.jsp表单值可以回显 //通过value="<%=request.getParameter("name")==null?"":request.getParameter("name")%>"进行回显 //在進行回显的时候address phone顯示提交的新的值,而name顯示oldaName,而不是新的值。 //2.2.3结束方法:return request.setAttribute("message","用户名"+name+"已经被占用,请重新选择"); request.getRequestDispatcher("updatecustomer.jsp").forward(request,response); return ; } } Customer customer1=new Customer(name,address,phone); customer1.setId(Integer.getInteger(id)); System.out.println("-------------------------------"); //4.调用CustomerDao的save(Customer customer)执行保存操作。 customerDao.update(customer1); //5.重定向到query.do response.sendRedirect("query.do"); //3.若检验通过。则把表单参数封装为一个Custoemr对象的customer } private void edit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forwardpath="/error.jsp"; // TODO Auto-generated method stub System.out.println("edit method"); int id=-1; //1.获取一个请求参数id String editstr=request.getParameter("id"); System.out.println("获取到的id是:"+editstr); //2.调用CustomerDao的customerdao.get(id)获取id对应的Customer对象和customer try{ Customer customeredit=customerDao.get(Integer.valueOf(editstr)); if(customeredit!=null){ forwardpath="/updatecustomer.jsp"; //3.将customer放入到request中 request.setAttribute("customer",customeredit); } } catch(Exception e){ e.printStackTrace(); } //4.响应updatecustomer.jsp页面 request.getRequestDispatcher(forwardpath).forward(request, response); } }未完待续