1.什么是Servlet?
a.运行在服务器端的一个小程序. 主要用来处理客户端的请求和服务器的响应.
b.JavaWeb的三大组件之一(Servlet , Filter , Listener).
2.Servlet的作用.
a.接收浏览器的请求.
b.对数据进行处理.
c.给浏览器一个响应.
3.Servlet的使用.
创建一个类 , 必须直接或者间接的实现javax.servlet.Servlet接口, 并实现service方法 。
两种使用方式:
①手动配置Servlet(编写xml配置文件)
②注解的方式(3.1版本才能用):
@WebServlet(urlpattern="/路径") = = = = @WebServlet(value="/路径")
@WebServlet("/虚拟路径"); / / 最简略写法!
4.servlet的执行流程(原理)
5.servlet获取参数和响应內容.
严格按照http协议格式:
1.将浏览器请求中的一切数据 - - > 封装成一个servletRequest对象.获取(getXXX)
- getParameter(String name): 获取指定参数名(表单name-必须写)对应的值.
2.将服务器响应的一切数据 - - > 封装成servlteResponse对象. 设置(setXXX)
- response.getWriter().print(); / / print可以写null. 所以建议用.
- response.getWriter().writer( ): / / 不能写null. 不建议使用.
6.servlet生命周期:
生命周期: 一个对象从创建到销毁的过程.
- init(ServletConfig): 第一次调用时, 初始化数据 . 执行1 次.
- service(request,response): 每一次请求都执行, 完成业务逻辑. 执行多次.
- destroy(): 关闭服务器时. 完成销毁 , 执行一次.
- servletConfig(); 对于配置 , 抽象成一个config对象.
ServletContext getServletContext() ; 获取servletContxt对象(上下文)
Servlet使用三层思想完成登录验证案例:
首先导入mysql驱动包 , c3p0 和 DbUtils jar包.
src下导入c3p0-config.xml配置文件 , 供c3P0工具类使用.
创建数据库和建表和添加数据(存储用户名和密码) , 以供使用.
页面: login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<!-- 需要跳转的servlet验证的地址 -->
<form action="http://localhost/aaa_login" method="post">
<!-- input标签中的name属性必须写,用来获取输入的值. -->
用户:<input type="text" name="username" placeholder="请输入用户名"><br />
密码:<input type="password" name="password" placeholder="请输入密码"><br />
<input type="submit" value="登录" />
</form>
</body>
</html>
web层:LoginServlet.java
@WebServlet("/aaa_login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应的编码格式.
response.setContentType("text/html; charset=utf-8");
// 获取账号和密码 .
String username = request.getParameter("username");
String password = request.getParameter("password");
// 创建Loginservice对象 .
LoginService ls = new LoginService();
// 调用login方法 , 参数传入获取到的用户名和密码.
Users user = ls.login(username, password);
// 对获取到的user进行判断 .
if (user!=null){
// 回写数据到浏览器上 , 给用户看.
response.getWriter().print("欢迎你,<font color=blue>"+username+"</font>");
}else {
response.getWriter().print("<font color = red>账号或者密码错误 , 请重新输入.</font>");
}
}
}
service层: LoginService.java
public class LoginService {
public Users login(String username, String password) {
// 创建LoginDao对象 ,
LoginDao ld = new LoginDao();
// 调用其方法 , 传入参数.
return ld.selectData(username, password);
}
}
dao层: LoginDao.java
public class LoginDao {
public Users selectData(String username, String password) {
//创建QueryRunner对象, 参数使用c3P0连接池获取连接对象.
QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSource());
// sql语句 , 查询数据库 .
String sql = "select * from users where username=? and password=? ";
try {
// 调用query方法,执行sql语句.
// BeanHandler: 查询一列,
return qr.query(sql,new BeanHandler<>(Users.class),username , password);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
domain层: User.java
public class Users {
// 成员变量必须跟数据库列名对应.
private int id;
private String username;
private String password;
get/set方法.
}
utils层: c3p0Utils.java
public class c3p0Utils{
private static final DataSource dataSource=new ComboPooledDataSource();
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}