package student.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import student.bean.Student;
import student.service.StudentService;
import student.service.impl.StudentServiceImpl;
import student.utils.WebTools;
import student.utils.WebUtils;
import student.web.formbean.StudentFromBean;public classController extends HttpServlet {
StudentService ss= newStudentServiceImpl();/**
* The doGet method of the servlet.
*
* 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 voiddoGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriterout =response.getWriter();//拿到页面传递的数据
String op = request.getParameter("op");
System.out.println("--op--" +op);//String name = request.getParameter("name");//System.out.println("--name---" + name);//根据页面数据做判断
if("all".equals(op)){
listAll(request,response);
}else if("add".equals(op)){
addStudent(request,response);
}else if("update".equals(op)){
update(request,response);
}else if("delete".equals(op)){
delete(request,response);
}else if("delmore".equals(op)){
delmore(request,response);
}else if("toupdate".equals(op)){
toupdate(request,response);
}
}private voidtoupdate(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//封装页面传递过来的数据//封装页面数据
StudentFromBean sfb = WebUtils.fillFormBean(StudentFromBean.class, request);
System.out.println("---formbean---" +sfb.toString());//检测数据
System.out.println("===validate===" +sfb.validate());if(sfb.validate()){//验证通过,将forbean中的数据拷贝到javabean中
Student s = newStudent();//由于时间是date类型,需要注册一个时间转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);try{
BeanUtils.copyProperties(s, sfb);
}catch(IllegalAccessException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(InvocationTargetException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---update封装了进来的数据---" +s);//根据formbean对象的id来封装数据,应该是已经封装进来了//s.setId(WebTools.createNewId());//其次由于hobby的类型不同,所以不会拷贝数据,需要收到拷贝//拿到页面的爱好数组,将数组拼接成一个字符串
String[] hobby =sfb.getHobby();if(hobby != null && hobby.length > 0){
StringBuffer sf= new StringBuffer(hobby[0]);for (int i = 1; i < hobby.length; i++) {
sf.append("," +hobby[i]);
}
s.setHobby(sf.toString());
}//此时应该是已经封装完成了 student对象s
System.out.println("---封装了全部数据,准备写入数据库---" +s);//调用service层完成业务逻辑,更新数据
boolean flag=ss.update(s);if(flag){//说明添加成功,转向主页面,//先重新查询数据库,拿取数据后在转向主页
listAll(request, response);
}else{//添加失败
request.setAttribute("errors", "修改失败");
request.getRequestDispatcher(request.getContextPath()+ "/update.jsp");
}
}else{//验证失败,踢回去,sfb对象存入request对象中,错误信息显示到页面上//算是数据回显
request.setAttribute("user", sfb);//给页面传递的
request.getRequestDispatcher("/update.jsp").forward(request, response);
}
}private voiddelmore(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//获取传递的ids
String all = request.getParameter("ids");
System.out.println("--all---" +all);//由于ids后面多了一个逗号,记得去掉 ----> 测试没有这一步也没有问题//ids = ids.substring(0, ids.length()-1) ;//拿到了ids,拆分后多次调用
String [] ids = all.split(",") ;for (int i = 0; i < ids.length; i++) {
System.out.println("id" +i+"---"+ids[i]);if(!ss.delete(ids[i])){//删除失败
request.getSession().setAttribute("error", "删除失败");
}
}
listAll(request, response);
}private voiddelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//根据id删除对应的行
String id = request.getParameter("id");
System.out.println("--id--" +id);//拿到了页面传递过来的id,根据id来删除用户
if(!ss.delete(id)){//删除失败
request.getSession().setAttribute("error", "删除失败");
}
listAll(request, response);
}private voidupdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{//获取id
String id = request.getParameter("id");//根据id来更新内容//根据id找到该用户,将该用户信息发送到更新页面上,提交到数据库
System.out.println("--update--" +id);
Student s=ss.findStudentById(id);
System.out.println("--find--" +s);if(s != null){//请求重定向,必须存放到session中,为什么不使用重定向 ??? 拭目以待
request.getSession().setAttribute("s", s);//response.sendRedirect(request.getContextPath() + "/update.jsp");
request.getRequestDispatcher("/update.jsp").forward(request, response);
}
}private voidaddStudent(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {//封装页面数据
StudentFromBean sfb = WebUtils.fillFormBean(StudentFromBean.class, request);
System.out.println("---formbean---" +sfb.toString());//检测数据
System.out.println("===validate===" +sfb.validate());if(sfb.validate()){//验证通过,将forbean中的数据拷贝到javabean中
Student s = newStudent();//由于时间是date类型,需要注册一个时间转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);try{
BeanUtils.copyProperties(s, sfb);
}catch(IllegalAccessException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(InvocationTargetException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---封装了一部分内容---" +s);//此时的s对象中没有id属性,需要通过一个类来生成id
s.setId(WebTools.createNewId());//其次由于hobby的类型不同,所以不会拷贝数据,需要收到拷贝//拿到页面的爱好数组,将数组拼接成一个字符串
String[] hobby =sfb.getHobby();if(hobby != null && hobby.length > 0){
StringBuffer sf= new StringBuffer(hobby[0]);for (int i = 1; i < hobby.length; i++) {
sf.append("," +hobby[i]);
}
s.setHobby(sf.toString());
}//此时应该是已经封装完成了 student对象s
System.out.println("---封装了全部数据,准备写入数据库---" +s);//调用service层完成业务逻辑
boolean flag =ss.add(s);if(flag){//说明添加成功,转向主页面,//先重新查询数据库,拿取数据后在转向主页
listAll(request, response);
}else{//添加失败
request.setAttribute("errors", "添加失败");
request.getRequestDispatcher(request.getContextPath()+ "/add.jsp");
}
}else{//验证失败,踢回去,sfb对象存入request对象中,错误信息显示到页面上//算是数据回显
request.setAttribute("user", sfb);//给页面传递的
request.getRequestDispatcher("/add.jsp").forward(request, response);
}
}private voidlistAll(HttpServletRequest request,
HttpServletResponse response) throws IOException {//显示所有的数据//拿到所有的数据
/**
* 分层思想,表现层调用业务逻辑层来完成,不需要管他们怎么实现。*/List list =ss.getAllStudent();//将数据存放到session中
/**
* 为什么要放到session中而不是request中 ?
* 这个地方如果采用请求转发,增加或改动之后,就会转发到这里来重新查询,但是当转发过来之后,又是一次。算了,自己试一次就知道了。
*
*
* 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。
* 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL,
* 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,
* request内的对象将无法使用。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,
* 浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。*/
//请求重定向,必须存放到session中
request.getSession().setAttribute("list", list);
response.sendRedirect(request.getContextPath()+ "/list.jsp");
}public voiddoPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}