zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
  • 相关阅读:
    【区间覆盖问题】uva 10020
    【Fibonacci】BestCoder #28B Fibonacci
    Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试
    血的教训 password写成passward,教训应该从首页赋值 参数名
    为什么这个地方用重定向会报错.只能用 服务器跳转?? 为什么我加了过滤器,还是能直接登陆 servlet
    //可以不保存在session中, 并且前面我保存在request,这里session也可以获取 chain.doFilter(request, response); //只有登录名不为空时放行,防止直接登录 成功的页面
    request.setAttribute("username", username);//一定要保存,OGNL才能获取${username}
    form表单的提交地址一定要是完整的绝对地址
    登录页面jsp跳转到另一个jsp 与jsp-Servlet-jsp
    在Windows下MyEclipse运行JAVA程序连接HBASE读取数据出错
  • 原文地址:https://www.cnblogs.com/maxuefeng/p/13959503.html
Copyright © 2011-2022 走看看