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版权协议,转载请附上原文出处链接和本声明。