Servlet类以及简单的登录功能

Servlet类:

     Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容。

负责处理响应与请求,相当于Controller层。

     实现步骤:

    1)创建类实现Servlet接口

    2)覆盖尚未实现的方法---重点实现service方法

    3)在web.xml进行servlet的配置

    在Java Resuorces 的src包上,创建类继承servlet类。

    当修改源代码时,必须重启服务器。让服务器在复制一份项目。

    localhost:8080/WEB01/MyServlet(WEB01后面就可以跟虚拟路径了)

    init()方法只会执行一次,service()访问一次执行一次。

    当关闭服务器时,destroy被执行,但是只有servers上的红灯关闭(stop()),才会被执行,当控制台上的强制关闭时,不会被执行。

    访问过程:

         解析请求地址:服务器操作的:

         当访问虚拟路径时,WEB01/MyServlet寻找web.xml文件,在找<servlet-mapping>,再找<url-pattern>/MyServlet</url-pattern>,<servlet-name>MyServlet</servlet-name>,再找<servlet-name>MyServlet</servlet-name>,<servlet-class>com.oracle.demo01.MyServlet</servlet-class>。  

 

将客户端的请求,按照http协议的格式,封装成http请求(请求行,请求头,请求体),发送给服务器,Tormat引擎第一步会解析请求地址,第二部创建Servlet对象(利用反射),第三步创建代表请求的request对象和代表代表响应的response对象,将请求信息封装到request对象,同时创建了一个response对象,第四步(因为要访问MyServlet),必然会执行service方法,service()方法有2个参数,request对象和response(是空的)对象,第三步到第四步,Tormat引擎会将这2个形参传过去,并且request封装的是请求信息,也就是说可以用arg0访问http请求的参数(请求行,请求头,请求体)。只有服务器响应客户端时,response(响应请求)才会被填充,也就说request时get方法(里面是满的,能通过get()方法得到),response是set方法(是空的,等着用set()方法赋值)。

         总结:没访问一次,创建一个request对象和response对象,两者相对。

 

               

public class MyServlet implements Servlet{

    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("MyServlet被创建了");
        //1:获取servlet初始化参数
        String value=arg0.getInitParameter("url");
        System.out.println(value);
        //2:获取Servlet名
        String name=arg0.getServletName();
        System.out.println(name);
        //3:获取ServletContext对象
        ServletContext context=arg0.getServletContext();
    }

    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("MyServlet被访问了");
        
    }
    public void destroy() {
        System.out.println("MyServlet被销毁了");
        
    }
    
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="#" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB01</display-name>
  <servlet>
    <servlet-name>MyServlet</servlet-name>   //实际上这里的名字可以随便起,但必须和下面的map映射的名字一致
    <servlet-class>com.oracle.demo01.MyServlet</servlet-class>  //实际路径
    <init-param>    //初始化参数
      <param-name>url</param-name>
      <param-value>mysql:localhost:3306</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>    //虚拟路径,
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>Servlet01</display-name>
    <servlet-name>Servlet01</servlet-name>
    <servlet-class>com.oracle.demo01.Servlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <!-- 完全匹配 -->
    <!-- 目录匹配 -->
    <!--  <servlet-name>/Servlet01</servlet-name> -->
 <url-pattern>/admin/*</url-pattern>
 <!-- 扩展名匹配 -->
<!--  <url-pattern>*.abc</url-pattern> -->
  </servlet-mapping>
</web-app>

   Servlet的生命周期:

          1)init(ServletConfig config)

            何时执行:servlet对象创建的时候执行

            ServletConfig : 代表的是该servlet对象的配置信息   <servlet-name>MyServlet</servlet-name>  <servlet-class>com.oracle.demo01.MyServlet</servlet-class>  封装的信息

            2)service(ServletRequest request,ServletResponse response)

                何时执行:每次请求都会执行

                ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息

                ServletResponse :代表响应 认为要封装的是响应的信息

            3)destroy()

                何时执行:servlet销毁的时候执行

    

  面试题

      1)Servlet何时创建

      默认(服务器启动时)第一次访问servlet时创建该对象

       2)Servlet何时销毁

      服务器关闭servlet就销毁了

       3)每次访问必然执行的方法

      service(ServletRequest req, ServletResponse res)方法

       问题:对XXXServlet进行了10次访问,init()一次,destory()一次,service()10次,doGet()10次,doPost()10次 一共执行力多少次?request对象创建几个?10个response创建几个?10个

  Servlet的配置:

      

          

 

<!-- 完全匹配 -->
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/Servlet01</url-pattern>     
    <!-- 目录匹配 -->
 <!-- <url-pattern>/admin/*</url-pattern> -->
 <!-- 扩展名匹配 -->
<!--  <url-pattern>*.abc</url-pattern> -->

        完全匹配可以与目录匹配可以。

欢迎页面:

    

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

 

但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,      我们一般创建类继承HttpServlet

    实现步骤:

        1)创建类继承HttpServlet类

        2)覆盖doGet和doPost

        3)在web.xml中进行servlet的配置

        在包上右键Servlet,

        配置模板过程:

              windows  preferences   template(模板)   Java   Templates  New servlet 

  

package com.oracle.demo01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello dandan...");//写入客户端
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 重命名时,需将xml中的手动改地址。

 doGet()方法实际上就是service方法,如果是get请求走get()方法,如果是post请求调用post()方法

 如果不行将服务器的WEB项目删掉(先将服务器关掉)

登录功能:

    Dynasmic WEB Project    Target   runtime   7.0  版本2.5    Java   Resources  建包   WebContent新建JSP File

    

  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/WEB02/LoginServlet" method="post">    //action指的是要访问的虚拟路径
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>     //叫login.jsp

 

package com.oracle.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.oracle.tools.JDBCUtils;

public class UserDao {
public int login(String uname,String pwd) throws SQLException{
    Connection conn=JDBCUtils.getConn();
    String sql="select count(*) from user where uname=? and pwd=?";
    PreparedStatement pst=conn.prepareStatement(sql);
    pst.setString(1, uname);
    pst.setString(2, pwd);
    ResultSet rs=pst.executeQuery();
    int count=0;
    while(rs.next()){
        count=rs.getInt(1);
    }
    JDBCUtils.close(conn, pst, rs);
    return count;
}
}
package com.oracle.service;

import java.sql.SQLException;

import com.oracle.dao.UserDao;

public class UserService {
    private UserDao userDao=new UserDao();
public int login(String uname,String pwd){
    int count=0;
    try {
        count=userDao.login(uname, pwd);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return count;
}
}
package com.oracle.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oracle.service.UserService;

public class LoginServlet extends HttpServlet {
private UserService userService=new UserService();
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户名密码
        String uname=request.getParameter("username");
        String pwd=request.getParameter("password");
        int count=userService.login(uname, pwd);
        if(count>0){
            //响应客户端
            response.getWriter().write("ok");
        }else{
            response.getWriter().write("false");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
package com.oracle.tools;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCUtils {
    // 获取连接对象
    public static Connection getConn() {
        // 1.注册驱动
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获取连接对象
            String url = "jdbc:mysql://localhost:3306/demo0803?characterEncoding=utf8";
            String user = "root";
            String pwd = "123456";
            conn= DriverManager.getConnection(url, user, pwd);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    //增删改释放资源
    public static void close(Connection conn,
                                PreparedStatement pst){
        if(pst!=null){
            try {
                pst.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    //查询释放资源
    public static void close(Connection conn,
            PreparedStatement pst,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(pst!=null){
            try {
                pst.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

 

posted @ 2020-11-11 16:50  马雪峰1  阅读(189)  评论(0编辑  收藏  举报