HttpServlet(开发使用)
1). 是一个 Servlet, 继承自 GenericServlet. 针对于 HTTP 协议所定制.
2). 在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest
和 HttpServletResponse. 并调用了重载的 service(HttpServletRequest, HttpServletResponse)
在 service(HttpServletRequest, HttpServletResponse) 获取了请求方式: request.getMethod().
根据请求方式有创建了 doXxx() 方法(xxx 为具体的请求方式, 比如 doGet, doPost)
package com.aff.java; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 针对于http协议定义的一个Servlet基类 * @author lz * */ public class MyHttpServlet extends MyGenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; } catch (ClassCastException e) { throw new ServletException("non-HTTP request or response"); } service(request, response); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取请求方式. String method = request.getMethod(); // 2. 根据请求方式再调用对应的处理方法 if ("GET".equalsIgnoreCase(method)) { doGet(request, response); } else if ("POST".equalsIgnoreCase(method)) { doPost(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
3). 实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可.(主要指doGet 和 doPost)
4). 优点: 直接由针对性的覆盖 doXxx() 方法; 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转.
练习:定义一个 login.html, 里边定义两个请求字段: user, password. 发送请求到 loginServlet
在创建一个 LoginServlet(需要继承自 HttpServlet, 并重写其 doPost 方法),
在其中获取请求的 user, password.
利用 JDBC 从 test_users 中查询有没有和页面输入的 user, password 对应的记录
SELECT count(id) FROM test_users WHERE user = ? AND password = ?
若有, 响应 Hello:xxx, 若没有, 响应 Sorry: xxx xxx 为 user.
准备: 在 MySQL 数据库中创建一个 users 数据表, 添加 3 个字段:
id, username, password. 并录入几条记录.
Loginservlet3
package com.aff.java; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.aff.util.JDBCUtilsC3P0; public class Loginservlet3 extends HttpServlet { private static final long serialVersionUID = -2287053550217699690L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; PrintWriter out = resp.getWriter(); try { conn =JDBCUtilsC3P0.getConnection(); String sql = "SELECT count(id) FROM users WHERE username = ? and password = ?" ; ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); if (rs.next()) { int count = rs.getInt(1); if (count>0) { out.print("hello:"+username); }else{ out.print("sorry:"+username); } } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtilsC3P0.closeResource(conn, ps, rs); } } }
login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="loginServlet" method="post"> user:<input type="text" name="username"/> password:<input type="password" name="password"/> <input type="submit" value="Submit"/> </form> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--配置当前web应用的初始化参数 全局的 --> <context-param> <param-name>user</param-name> <param-value>hmm</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123456</param-value> </context-param> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.aff.java.Loginservlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping> </web-app>