day52
servlet
綜合案例
登錄功能
設置歡迎頁
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>login.html</welcome-file></welcome-file-list> </web-app>項目啟動直接加載login.html頁面
login.html,用戶輸入自己的用戶名和密碼,提交后交給mylogin請求
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>login</title> </head> <body> ? <form action="mylogin" method="post">username: <input type="text" name="username" placeholder="username"><p />password: <input type="password" name="password" placeholder="password"><p /><input type="submit" value="login"><p /> </form> </body> </html>
由mylogin請求對應的servlet來進行處理
package com.saas.servlet; ? import com.saas.service.IAccountService; import com.saas.service.impl.AccountServiceImpl; ? import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; ? @WebServlet(urlPatterns = "/mylogin") public class MyLoginServlet extends HttpServlet { ?private IAccountService ias = new AccountServiceImpl(); ?@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);} ?@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");System.out.println("this is my login servlet ."); ?String username = req.getParameter("username");String password = req.getParameter("password"); ? ?boolean flag = ias.login(username, password); ?if (flag) {System.out.println("login success");req.getRequestDispatcher("main.html").forward(req, resp);} else {System.out.println("login fail");req.getRequestDispatcher("login.html").forward(req, resp);}} }
mylogin所對用的MyLoginServlet會調用IAccountService接口和AccountServiceImpl實現類完成成service中登錄方法的校驗
package com.saas.service; ? public interface IAccountService {boolean login(String username, String password); }
AccountServiceImpl是service的實現類,調用dao接口和dao實現類完成dao層的登錄方法校驗
package com.saas.service.impl; ? import com.saas.dao.IAccountDao; import com.saas.dao.impl.AccountDaoImpl; import com.saas.service.IAccountService; ? public class AccountServiceImpl implements IAccountService { ?private IAccountDao iAccountDao = new AccountDaoImpl();@Overridepublic boolean login(String username, String password) {return iAccountDao.login(username, password);} }
dao接口
package com.saas.dao; ? public interface IAccountDao {boolean login(String username, String password); }
dao實現類,使用apache的dbutil工具jar包的queryrunner對象即可完成所有的crud功能
本方法完成登錄功能
借助DruidUtil工具類的getDataSource()方法得到一個DataSource對象來創建QueryRunner對象
package com.saas.dao.impl; ? import com.saas.dao.IAccountDao; import com.saas.entity.Account; import com.saas.util.DruidUtil; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; ? import java.sql.SQLException; ? public class AccountDaoImpl implements IAccountDao { ?private QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());@Overridepublic boolean login(String username, String password) { ?try {String sql = "select * from account where name = ? and pass = ?";Account a = qr.query(sql, new BeanHandler<Account>(Account.class), new Object[]{username, password}); ?return a != null;} catch (SQLException e) {throw new RuntimeException(e);}} }
dao借助工具類完成與數據庫的交互,得到一個用戶名和密碼對應的Account對象,通過Account對象是否為空判斷用戶是否存在
dao完成用戶賬戶信息的判斷后,返回給service,返回給servlet
在servlet中通過返回值動態決定調轉到main.html頁面還是繼續回到login.html頁面,最終完成一個登錄功能
查詢所有學生
main.html頁面中有一個查詢所有學生的超鏈接
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>main</title> </head> <body> <h1>this is main page</h1> ? <a href="stus">show all students</a> </body> </html>
該超鏈接發送一個地址為stus的請求,該請求交給一個servlet: AllStudentServlet.java
package com.saas.servlet;import com.saas.entity.Student; import com.saas.service.IStudentService; import com.saas.service.impl.StudentServiceImpl;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List;@WebServlet(urlPatterns = "/stus") public class AllStudentServlet extends HttpServlet {private IStudentService iss = new StudentServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");resp.setCharacterEncoding("UTF-8");req.setCharacterEncoding("UTF-8");List<Student> list = iss.getAllStudents();System.out.println(list);PrintWriter out = resp.getWriter();out.print("<table border='1' align='center' width='80%'>");out.print("<tr>");out.print("<td>編號</td>");out.print("<td>姓名</td>");out.print("<td>性別</td>");out.print("<td>年齡</td>");out.print("<td>成績</td>");out.print("<td>管理</td>");out.print("</tr>");for (Student s : list) {out.print("<tr>");out.print("<td>" + s.getSid() + "</td>");out.print("<td>" + s.getName() + "</td>");out.print("<td>" + s.getSex() + "</td>");out.print("<td>" + s.getAge() + "</td>");out.print("<td>" + s.getScore() + "</td>");out.print("<td><a href='GetStudentBySidServlet?sid=" + s.getSid() + "'>update</a> <a href='#'>delete</a> </td>");out.print("</tr>");}out.print("</table>");} }
該servlet借助IStudentService的service接口和StudentServiceImpl的service接口的實現類,完成全部學生信息的查詢
service接口IStudentService.java
package com.saas.service;import com.saas.entity.Student;import java.util.List;public interface IStudentService {List<Student> getAllStudents();Student getStudentBySid(int sid);boolean updateStudent(Student student); }
service接口的實現類StudentServiceImpl.java
package com.saas.service.impl;import com.saas.dao.IStudentDao; import com.saas.dao.impl.StudentDaoImpl; import com.saas.entity.Student; import com.saas.service.IStudentService;import java.util.List;public class StudentServiceImpl implements IStudentService {private IStudentDao isd = new StudentDaoImpl();@Overridepublic List<Student> getAllStudents() {return isd.getAllStudents();}@Overridepublic Student getStudentBySid(int sid) {return isd.getStudentBySid(sid);}@Overridepublic boolean updateStudent(Student student) {return isd.updateStudent(student) > 0;} }Student的service接口調用Student的dao完成與數據庫的交互,并將數據返回
package com.saas.dao;import com.saas.entity.Student;import java.util.List;public interface IStudentDao {List<Student> getAllStudents();Student getStudentBySid(int sid);int updateStudent(Student student); }package com.saas.dao.impl;import com.saas.dao.IStudentDao; import com.saas.entity.Student; import com.saas.util.DruidUtil; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler;import java.sql.SQLException; import java.util.List;public class StudentDaoImpl implements IStudentDao{private QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());@Overridepublic List<Student> getAllStudents() {try {return qr.query("select * from student", new BeanListHandler<Student>(Student.class));} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic Student getStudentBySid(int sid) {try {return qr.query("select * from student where sid = ?", new BeanHandler<Student>(Student.class), sid);} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic int updateStudent(Student student) {try {return qr.update("update student set name = ?, sex = ?, score = ?, cid = ?, age = ? where sid = ? ",student.getName(), student.getSex(), student.getScore(), student.getCid(), student.getAge(), student.getSid());} catch (SQLException e) {throw new RuntimeException(e);}} }
完成所有學生信息的查詢,返回給service,返回給servlet
在servlet中將學生的list借助servlet在頁面中以表格方式呈現
查詢單個學生對象
在AllStudentServlet這個servlet的表格中,每一個數據的最后放置了一個修改的超鏈接
<a href='GetStudentBySidServlet?sid=" + s.getSid() + "'>update</a>在這個超鏈接中,href為GetStudentBySidServlet,那么請求將交給GetStudentBySidServlet地址所對應的sevlet,該請求的最后還有一個問號傳參
該請求將交由GetStudentBySidServlet.java的servlet來處理
package com.saas.servlet;import com.saas.entity.Student; import com.saas.service.IStudentService; import com.saas.service.impl.StudentServiceImpl;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;@WebServlet("/GetStudentBySidServlet") public class GetStudentBySidServlet extends HttpServlet {private IStudentService studentService = new StudentServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");resp.setCharacterEncoding("UTF-8");req.setCharacterEncoding("UTF-8");System.out.println("this is update student page.");String ssid = req.getParameter("sid");int sid = ssid == null ? 0 : Integer.parseInt(ssid);Student s = studentService.getStudentBySid(sid);PrintWriter out = resp.getWriter();out.print("<h1>this is update student page.</h1>");out.print("<form action='UpdateStudentServlet' method='post'>");out.print("<input type=\"hidden\" name=\"sid\" value=\"" + s.getSid() + "\"><p />");out.print("name:<input type=\"text\" name=\"name\" value=\"" + s.getName() + "\"><p />");out.print("sex:<input type=\"text\" name=\"sex\" value=\"" + s.getSex() + "\"><p />");out.print("age:<input type=\"text\" name=\"age\" value=\"" + s.getAge() + "\"><p />");out.print("score:<input type=\"text\" name=\"score\" value=\"" + s.getScore() + "\"><p />");out.print("cid:<input type=\"text\" name=\"cid\" value=\"" + s.getCid() + "\"><p />");out.print("<input type=\"submit\" value=\"update\"><p />");out.print("</form>");} }
該servlet借助IStudentService對象的getStudentBySid方法,進行用戶編號查詢用戶的操作
該servlet同樣調用service以及dao完成數據的查詢,得到sid對應的學生對象
得到問號傳參傳遞過來的sid的值,將該sid對應的學生對象以表單方式呈現給用戶
修改學生對象
在GetStudentBySidServlet的servlet里面,由form表單將數據庫中指定sid對應的學生對象呈現在頁面表單中
用戶在該表單中修改該學生信息
點擊提交按鈕,將發送一個新的請求,該請求是form表單中action所對應的UpdateStudentServlet的servlet
所以該表單提交后交給UpdateStudentServlet這個sevlet
package com.saas.servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;import com.saas.entity.Student; import com.saas.service.IStudentService; import com.saas.service.impl.StudentServiceImpl;@WebServlet(urlPatterns = "/UpdateStudentServlet") public class UpdateStudentServlet extends HttpServlet {private IStudentService istudentService = new StudentServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");int sid = Integer.parseInt(req.getParameter("sid"));String name = req.getParameter("name");String sex = req.getParameter("sex");double score = Double.parseDouble(req.getParameter("score"));int cid = Integer.parseInt(req.getParameter("cid"));int age = Integer.parseInt(req.getParameter("age"));Student student = new Student(sid, name, sex, score, cid, age);boolean flag = istudentService.updateStudent(student);if (flag) {resp.getWriter().write("<script>alert('修改成功');location.href='/day51/stus'</script>");} else {resp.getWriter().write("<script>alert('修改失敗');location.href='/day51/stus'</script>");}} }該servlet收集用戶輸入的所有信息,將這些所有信息封裝為一個Student對象
再將Student對象借助Student的service和dao完成一個修改功能
修改成功后給用戶一個修改成功的彈框并跳轉到stus所對應的servlet展示最新的學生列表信息
修改失敗給用戶一個提示,也跳轉到stus請求對應的serlvet