JavaWeb02(Servlet、登录案例)

Part01:Servlet

1、Servlet概述:
  • Servlet是一个实现了Servlet接口的java类,用于交互式的浏览和修改数据,生成动态Web内容。
2、Servlet的作用:
  • 接收浏览器传来的请求
  • 处理请求
  • 返回响应,生成动态的Web内容
3、Servlet编写步骤:
  • 创建一个实现Servlet接口的Java类
  • 重写Servlet中的方法
  • 映射Servlet,在web.xml配置文件中的servlet标签中
    • servlet-name:给当前的Servlet定义一个名字
    • servlet-class:需要处理请求的Servlet的带包的路径
  • 绑定路径,在web.xml配置文件中的servlet-mapping标签中
    • servlet-name:对应Servlet实体类的名称
    • url-pattern:当前的Servlet的路径
      在这里插入图片描述
  • 测试路径:协议://主机:端口号/绑定路径
4、使用IDEA快速创建Servlet
  • 在src目录下右键选择new->选择Servlet
    在这里插入图片描述
  • 填写类名和选择相应的包名
    在这里插入图片描述
  • 在创建的Servlet文件的注解中添加urlPatterns(这样不用在web.xml中配置就可以使用):
    在这里插入图片描述
@WebServlet(name = "MyServlet",urlPatterns = {"/servlet/MyServlet"})
  • 可以通过【http://主机:端口/添加的urlPatterns的值】访问
5、Servlet体系结构
  • Servlet接口
    • 方法:
      • void init (ServletConfig config);//初始化方法
      • void service(ServletRequest request,ServletResponse response);//服务方法
      • void destroy( );//销毁方法
      • ServletConfig getServletConfig( );//获取当前Servlet的配置对象
      • String getServletInfo( );//获取当前Servlet的信息
    • Servlet生命周期:默认收到第一次请求的时候,服务器创建Servlet对象,且调用init方法实现初始化操作,同时调用service方法,每收到一次请求时,服务器获取一个线程,调用service方法完成具体的业务逻辑,当Servlet被移除或者服务器正常关闭的时候,服务器会调用destroy方法实现销毁操作;(单实例,多线程)
  • GenericServlet抽象类
    • 实现了Servlet接口
    • 除了service方法没有实现,其他都实现了
  • HttpServlet抽象类
    • 继承了GenericServlet抽象类
    • 实现了service方法
      • 把参数ServletRequest,ServletResponse强转为HTTPServletRequest,HTTPServletResponse
      • 调用重载的service方法,传递强转后的参数
        • 获取请求方式
        • 根据请求方式的不同调用doGet/doPost/doXxx方法
6、web.xml配置:
  • url-pattern配置:
    • 完全匹配:以“/”开始;如:/servlet
    • 目录匹配:以”/“开始,以“ * ”结束;如:/a/、/
    • 后缀名匹配:以“ * ”开始;如:.jsp、.action
    • 优先级:完全匹配>目录匹配>后缀名匹配
    • 注意⚠️:一个路径不能对应多个Servlet,但是一个Servlet可以对应多个路径
  • load-on-startup的配置:
    • 作用:修改Servlet的初始化时间,会随着服务器启动而创建Servlet
    • 使用格式:在servlet标签中:正整数

Part02:登录案例

1、需求:
  • 获取用户在网页上输入用户名和密码,与数据库中一致登陆成功,显示XXX,欢迎回来,若不一致,显示登陆失败;
2、获取参数及往页面上输出内容:
  • 获取请求参数的方法:String value = request.getParameter(String 表单中的name属性值)
  • 往浏览器写东西:response.getWriter( ).print(“”);
3、案例实现步骤:
  • 创建数据库表及添加数据
    在这里插入图片描述
  • 创建动态Web项目
  • 创建包结构
    • utils
    • Servlet
    • service
    • dao
    • bean
      在这里插入图片描述
  • 导入项目需要的jar包、工具类、配置文件
    在这里插入图片描述
//C3P0Utils代码
package utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Utils {
    private static ComboPooledDataSource ds = new ComboPooledDataSource();
    //获取连接池对象
    public static DataSource getDataSource(){
        return ds;
    }
    //获取连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}
  • 写静态HTML文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--创建视口-->
    <meta name="viewport" content="width=device-width,nitial-scale=1">
    <title>Title</title>
    <!--导入jQuery文件-->
    <script type="text/javascript" src="js/jquery-1.11.0.js"></script>
            <!--导入bootstrap.css文件-->
    <link rel="stylesheet" href="css/bootstrap.css"/>
    <!--导入bootstrap.js文件-->
    <script type="text/javascript" src="js/bootstrap.js"></script>
</head>
<body>
<div>

<!--from水平表单-->
<form class="form-horizontal " role="form" method="post" action="/servlet/UserServlet">
    <div class="form-group">
        <label for="username" class="col-sm-2 control-label">用户名</label>
        <div class="col-sm-10">
            <input style="width: 300px" type="text" name="username" class="form-control" id="username" placeholder="请输入用户名" >
        </div>
    </div>
    <div class="form-group">
        <label for="password" class="col-sm-2 control-label">密码</label>
        <div class="col-sm-10">
            <input style="width: 300px" type="password" name="password" class="form-control" id="password" placeholder="请输入密码" >
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <div class="checkbox">
                <label>
                    <input type="checkbox">请记住我
                </label>
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <input  type="submit" class="btn btn-default" value="登录" />
        </div>
    </div>
</form>
</div>
</body>
</html>
  • 编写Dao文件
    • 创建QueryRunner对象
    • 编写查询的SQL语句
    • 执行SQL语句
package dao;

import bean.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import utils.C3P0Utils;

import java.sql.SQLException;

public class UserDao {
    //创建QueryRunner对象
    private static QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    public static User queryUser(String username,String password) throws SQLException {
        //编写查询的SQL语句
        String sql = "select * from user where username=? and password = ?";
        //执行SQL语句
        User user = qr.query(sql,new BeanHandler<User>(User.class),username,password);
        //返回查询结果
        return user;
    }
}

  • 编写Service文件
    • 创建Dao
    • 调用Dao中的方法
package service;

import bean.User;
import dao.UserDao;

import java.sql.SQLException;

public class UserService {
    //创建UserDao
    private static UserDao userDao = new UserDao();
    public static User queryUser(String username,String password){
        User user = null;
        try {
            //调用UserDao的queryUser方法
            user = userDao.queryUser(username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
    }
}
  • 编写Servlet文件
    • 获取用户名和密码
    • 创建service并调用方法
    • 判断用户输入的数据在数据库中是否存在
      • 若存在:XXX,欢迎回来
      • 若不存在:登录失败
package Servlet;

import bean.User;
import service.UserService;

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

@WebServlet(name = "UserServlet",urlPatterns = {"/servlet/UserServlet"})
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置response编码格式为utf-8,这样给前台写中文信息不会出现乱码
        response.setHeader("content-type","text/html;charset=utf-8");
        //获取请求的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //调用UserService的queryUser方法,把从前端HTML获取的用户名和密码传过去
        User user = UserService.queryUser(username,password);
        //判断从数据库中查询的数据,若查询到,登录成功,否则,登录失败
        if(user == null){
            //往前端HTML页面写信息
            response.getWriter( ).print("登录失败");
        }else {
            //往前端HTML页面写信息
            response.getWriter( ).print(username+",欢迎回来");
        }
    }

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

    }
}

效果如下:
在这里插入图片描述
在这里插入图片描述


版权声明:本文为weixin_44090966原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。