servlet及登录注册案例

★★★注意实现★★★
    web.xml只有在新建Servlet时候会自动配置.
    后期修改包/类,删除包/类,需要手动配置web.xml
    【选中服务器名称,列如  UserServlet1 , 右击点击Copy Qualified Name,然后在去web.xml中的servlet-class复制即可】

    Servlet本质上是个class(类)

第一部分:今日技术操作及其概述

1.Servlet生命周期 【*****面试可能会问到】★★★★★
    *Servlet对象从创建到销毁的过程
    *init:初始化 (只要Servlet一创建,init方法就会被创建)
        何时执行:第一次访问Servlet创建(Tomcat服务器给我们创建的,不是我们new的)
        执行次数:一生只执行一次,单例
    *servlet: 服务
        何时执行:每次访问该Servlet时执行 (只要任何一次客户端向服务器发送请求,service方法就会执行)
        执行次数:访问一次执行一次
    *destory: 销毁
        何时执行:项目被移除,或者服务器关闭
        执行次数:一生只执行一次

    *用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.
        在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).
        当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.

2.url-pattern的配置
    * url-pattern的配置方式共有三种(servlet用第一种,第二和第三种在servlet阶段不用)
        [1]完全路径匹配:以/开始  例如:/ServletDemo4        /aaa/ServletDemo5     /aaa/bbb/ServletDemo6 
        [2]目录匹配:     以/开始,需要以*结束    例如:" /* /aaa/*    /aaa/bbb/* "
        [3]扩展名匹配:    不能以/开始,以*开始的    例如:*.do      *.action      
    *匹配优先级:  完全路径匹配优先级 > 目录匹配优先级 > 扩展名优先级

3.开发中路径的编写
    *相对路径:都是需要找位置相对关系。不能以/开始的   【不推荐使用】
        ./当前路径      ../上一级目录

    *绝对路径:不需要找位置相对关系。以/开始的  【以绝对路径为主】
        *绝对路径中分为客户端路径和服务器端路径
            *客户端路径一定要加工程名。      /day09/ServletDemo6
            *服务器端路径不需要加工程名。 /ServletDemo6

4.response中设置响应头
    *addHeader(String name,String value):   针对一个key对应多个value的响应头
    ** setHeader(String name,String value): 针对一个key对应一个value的响应头
         setDateHeader(String name,long date);
         setIntHeader(String name,int value);

5.ServletContext对象
    *ServletContext对象存取数据,存的数据都是有一定的作用的范围的.这种对象称为是域对象.
        *setAttribute(String name,Object object)    用来向ServletContext中存入数据
        *getAttribute(String name)      用来从ServletContext中获取数据
        *removeAttribute(String name)   用来从ServletContext中移除数据

6.ServletContext: 【重要】
    *ServletContext的作用:
        [1]用来获得全局初始化参数
        [2]用来获得文件的MIME的类型   【后面学】
        [3]作为域对象存取数据
        [4]用来读取web项目下的文件

    *ServletContext:是一个域对象
        *作用范围:整个web工程
        *创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独的ServletContext对象
        *销毁:服务器关闭的时候,或者项目从服务器中移除的时候

第二部分:今日代码实现

1.使用Servlet完成一个用户登陆的案例
[1]创建数据库和表
[2]创建包和类,引入jar包(jar包  WebContent/WEB-INF/lib  有c3p0-0.9.1.2.jar  commons-dbutils-1.4.jar  mysql-connector-java-5.0.8-bin.jar)
    *创建一个包,包下面四个类,类名可以叫 (User.java   UserDao.java(数据处理层)   UserService.java(业务层)   UserServlet.java(web层也叫服务器层)  )
    *在src下引入  c3p0-config.xml
    *在WebContent下创建一个文件夹,可以叫demo3_login,可以把老师的登陆页面和网站首页给复制到里面,包括图片和JS。
[3]引入login页面
[4]编写Servlet-->Service-->DAO

【1】
    打开引入的login.html文档文件,找到会员登陆下的<form表单>,在<form>里面加action和method,在用户名和密码下加name属性
    <form class="form-horizontal" action="/day14_web/UserServlet" method="post">
    <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名">
    <input type="password" class="form-control" id="inputPassword3" name="password" placeholder="请输入密码">

【2】
    在c3p0-config.xml中,把数据库名称和密码改一下
<xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql:///day14</property>
    <property name="user">root</property>
    <property name="password">0000</property>
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">20</property>
  </default-config>

</c3p0-config>

【3】
    User.java写代码

package com.itheimademo1_login;

public class User {
    private int id;
    private String username;
    private String password;
    private String nickname;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

【4】
    UserDao.java写代码

package com.itheimademo1_login;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.itheima.utils.JDBCUtils;

/*
 *登陆案例Dao 的代码
 */
public class UserDao {
    /*
     * 用户登陆的Dao的方法
     */
    public User login(User user) throws Exception {
        //连接数据库,之前jar包是dbutils,就可以直接用QueryRunner方法
        //但是QueryRunner需要写个连接池,所以把C3P0配置文件和工具类给弄过来
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        //创建SQL语句
        String sql = "select*from user where username=? and password=?";
        //执行SQL语句  queryRunner有个方法是查询的意思,就是query
        User existuser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
        return existuser;
    }

}

【5】
    UserService.java写代码

    package com.itheimademo1_login;
/*
 * 登陆案例的Service代码
 */
public class UserService {
    /*
     * 业务层用户登录的方法
     */
    public User login(User user) throws Exception {
        //调用Dao完成对数据库的查询操作
        UserDao userDao = new UserDao();
        User user1 = userDao.login(user);
        return user1;
    }

}

【6】
     UserServlet.java写代码

    package com.itheimademo1_login;
/*
 * 登陆代码的servlet
 */
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 UserServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
        //第一步:接收表单提交的参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //第二步:封装到实体对象中(将username和password这二个参数封装到实体对象中)
        User user =  new User();
        user.setUsername(username);
        user.setPassword(password);    //这些数据就封装到user对象中了

        //第三步:调用业务层处理数据 (分析:我们要去查询,既然是查询就要经过业务层,由业务层调用Dao层)
        UserService userservice = new UserService();
          //可以调用userservice里面的方法,来完成一个登陆的功能
        User existuser = userservice.login(user);   //把封装好的user传入里面,给个返回值,可以返回布尔类型,代表成功和失败,也可以返回整数类型,也可以返回一个对象existUser,如果返回的是null,就代表没查到。

        //第四步:根据处理的结果显示信息(页面跳转)【分析:这个时候如果数据处理完了,要进行响应,也可以直接输出,只要标识登陆成功或者失败就可以了】
        if(existuser == null){
            response.getWriter().println("登陆失败");
        }else{
            response.getWriter().println("登陆成功");
        }
        } catch (Exception e) {
            e.printStackTrace();
        }    
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

}

【7】 在控制台Servlet运行,然后在浏览器中输入网址即可
http://localhost:8080/day14_web/demo3_login/login.htm

2.登录成功以后5秒钟跳转到另一个页面

其他代码都和上面一样,就在if判断中改一下即可

        if(existuser == null){
            response.getWriter().println("<h1>登陆失败:用户名和密码错误</h1>");
        }else{
            response.getWriter().println("<h1>登陆成功:你好"+existuser.getNickname()+"</h1>");
            response.getWriter().println("<h1>页面将在5秒后跳转</h1>");
            response.setHeader("Refresh", "5;url = /day14_web/demo3_login/index.html");  【括号中为http协议规定的格式,逗号后面是5秒后跳转的地址】
        } 
        }catch (Exception e) {
            e.printStackTrace();
        }   

3.登录成功以后5秒钟跳转到另一个页面

其他都和上面一样

[1]
if(existuser == null){
            response.getWriter().println("<h1>登陆失败:用户名和密码错误</h1>");
        }else{
            /*response.getWriter().println("<h1>登陆成功:你好"+existuser.getNickname()+"</h1>");
            response.getWriter().println("<h1>页面将在5秒后跳转</h1>");
            response.setHeader("Refresh", "5;url = /day14_web/demo3_login/index.html");*/

            //可以重定向完成页面跳转,可以通过设置头去实现,302是重定向,所以location必须结合302一起使用,302是一个状态码,我们response里面的setStatus可以设置状态码
            response.setStatus(302);
            response.setHeader("Location","/day14_web/demo3_login/success.html");   //Location就是直接跳转了,里面直接写路径就可以了

[2]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Refresh" content="5;url=/day14_web/demo3_login/index.html" />
<title>Insert title here</title>
<script type="text/javascript">
    //设置定时,先定义一个time
    var time = 5;
 //页面一加载就计时
    window.onload=function(){
        //定时
    setInterval('changeTime()', 1000);
    }
    function changeTime(){
    //修改时间
    time -- ;
    document.getElementById("s1").innerHTML= time ;
    }
 </script>
</head>
<body>
    <h1>登陆成功!</h1>
    <h3>页面将在<span id="s1">5</span>秒后跳转!</h3>
</body>
</html> 

[3]

OneServlet

package com.itheima.scope;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 向上下文对象添加一个共享数据
 * 
 */
public class OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取上下文对象
        ServletContext context = getServletContext();

        // 2. 设置共享数据
        context.setAttribute("username", "王青原");
        System.out.println("设置共享数据");
    }

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

}


TwoServlet

package com.itheima.scope;

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 TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据
        String username = (String) getServletContext().getAttribute("username");
        System.out.println(username);
    }

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

猜你喜欢

转载自blog.csdn.net/pf503603/article/details/81835038