上次的习题答案:
web.xml:
login.html:
LoginServlet:
开始进一步关于Servlet的学习:
1.GenericServlet(了解):
1).是一个Servlet,是Servlet接口和ServletConfig接口的实现类,但是一个抽象类,其中的service方法为抽象方法
2).如果新建的Servlet程序直接继承GenericServlet 会使开发更简洁。
3).具体实现:
①. 在GenericServlet 中声明了一个ServletConfig 类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
②. 利用servletConfig 成员变量的方法实现了ServletConfig接口的方法
③. 还定义了一个init()方法,在init(ServletConfig) 方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化。
④. 不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(config),而还使用了ServletConfig 接口的方法,则会出现空指针异常。
⑤. 新建的init(){}并非Servlet的生命周期方法,而init(ServletConfig)才是生命周期相关的方法。
代码:
public abstract class MyGenericServlet implements Servlet,ServletConfig {
/**
* 以下方法为Servlet接口的方法
*/
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public String getServletInfo() {
return null;
}
private ServletConfig servletConfig;
@Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig=arg0;
init();
}
public void init() throws ServletException {
}
@Override
public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
/**
* 以下方法为ServletConfig接口的方法
*/
@Override
public String getInitParameter(String arg0) {
return servletConfig.getInitParameter(arg0);
}
@Override
public Enumeration<String> getInitParameterNames() {
return servletConfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
return servletConfig.getServletContext();
}
@Override
public String getServletName() {
return servletConfig.getServletName();
}
}
2.*HttpServlet:
1).是一个Servlet,继承自GenericServlet,针对于HTTP协议所定制。
2).在service() 方法中直接把ServletRequest 和 ServletResponse 转为HttpServletRequest 和 HttpServletResponse
并调用了重载的service(HttpServletRequest,HttpServletResponse)
在service(HttpServletRequest,HttpServletResponse)获取了请求方式:request.getMethod()。
根据请求方式创建了doXxx()方法(Xxx 为具体的请求方式,比如:doGet,doPost)。
代码:
@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);
}
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,不再需要强转。
3.
-------------------------------练习题----------------------------------------------
在 MySQL 数据库中创建一个 test_users 数据表, 添加 3 个字段: id, user, password. 并录入几条记录.
定义一个 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.
-----------------------------------------------------------------------------