★★★注意实现★★★
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);
}
servlet及登录注册案例
最新推荐文章于 2020-09-08 08:44:16 发布