尚硅谷JavaWeb的自学之路二(Servlet-2)

上次的习题答案:

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.

-----------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值