Servlet
案例:商城的登录的功能的实现
一,案例需求
+ 在登录的页面中输入用户名和密码点击登录,完成登录的功能.登录成功,提示用户 “Login Success”;登录失败,提示用户”Login Fail…”
二,技术分析
1. Servlet的概述
1.1什么是Servlet
Servlet 运行在服务端的Java小程序,是sun公司提供的一套规范,用来处理客户端请求、响应给浏览器的动态资源。
1.2Servlet的作用
用来处理从客户端发送过来的请求,并对该请求作出响应。
Servlet的任务有:
获取请求数据
调用业务
分发转向/响应
2.Servlet的入门
2.1准备工作
Servlet规范要求:Servlet程序需要实现Servlet接口,并在web.xml进行配置。
1.编写一个类
实现servlet的接口
重写方法(service)
2.编写配置文件
注册servlet
绑定路径
3.测试
协议://主机:端口号/项目名/绑定路径
2.2实现步骤
步骤一:编写一个类,实现servlet的接口
public class ServletDemo implements Servlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("hello ServletDemo..");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
}
步骤二:修改应用中的web.xml文件,配置一个可供外部访问的URI标签
<!-- 实例化一个servlet对象 -->
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>com.itheima.demo01.ServletDemo</servlet-class>
</servlet>
<!--创建一个供外界访问的路径 -->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
步骤三:部署应用
2.3 Servlet的执行的流程详解
2.4简单写法
直接创建一个Servlet
2.5Servlet的继承关系
Servlet规范规定,所有的servlet必须实现 javax.servlet.Servlet接口。
2.5.1Servlet的API
★void init(ServletConfig config):初始化方法
★void service(ServletRequest request,ServletResponse response):服务方法
★void destroy():销毁方法
ServletConfig getServletConfig():获取当前servlet的配置对象(了解)
String getServletInfo()
2.5.2,Servlet的生命周期
2.5.2.1 生命周期
一个对象从创建到销毁的过程
2.5.2.2 Servlet生命周期
servlet从创建到销毁的过程
出生:(初始化)用户第一次访问时执行。
活着:(服务)应用活着。每次访问都会执行。
死亡:(销毁)应用卸载。
serrvlet生命周期方法:
init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()
2.5.2.3生命周期方法的执行
当客户端第一次请求的时候,会执行init方法,创建出来
客户端任何一次请求会执行Service方法,
当servlet从服务器移除或者服务器正常关闭会执行destroy方法
Servlet是单例(只有一个对象), 默认情况下,当第一次请求的时候,调用init()方法,创建出来. 任何一次请求,都会获得一个线程,来处理请求,调用Service()方法. 当servlet从服务器移除或者服务器正常关闭,会执行destroy方法,把对象给销毁.(设计模式:单例模式)
Servlet是单实例多线程的
doGet()/doPost()方法是从Service()方法里面分出去的.
2.5.3GenericServlet里面的方法
只有Service方法没有实现,其它的四个方法都实现了.
2.5.4HttpServlet里面的方法
实现Service方法, 在Service方法里面
1.强转了两个参数
2.调用了自己的service方法
在自己的service方法里面:
1.判断是get/post…请求
2.根据不同的请求调用对应的doGet/doPost方法
书写Servlet: 创建Servlet,重写doGet和doPost方法
3.request接收请求参数
request对象的原型是javax.servlet.http.HttpServletRequest.此对象由服务器自动创建。服务器创建request对象的时候,把请求的三样东西(请求行,请求头,请求体)封装在了这个对象里面
url?username=zs&password=1234&hobby=lq&hobby=zq
方法名 | 描述 |
---|---|
String getParameter(String name) | 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack |
String[] getParameterValues(String name) | 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒 |
Map |
4. Request接收请求参数入门程序
步骤一:编写表单,提供表单字段:username、password、hobby,以post方式提交
步骤二:编写Servlet实现类,使用对应方法获得请求参数,并处理POST中文乱码
步骤三:测试提交表单。控制台显示.
表单
<form action="提交的路径(servlet)" method="post"> 用户名:<input type="text" name="username"/><br /> 密码:<input type="password" name="password" /><br /> 爱好: <input type="checkbox" name="hobby" value="篮球" />篮球 <input type="checkbox" name="hobby" value="足球" />足球 <input type="checkbox" name="hobby" value="乒乓球" />乒乓球 <input type="checkbox" name="hobby" value="看电影" />看电影<br /> <input type="submit" /> </form>
三,思路分析
- 创建页面
- 创建数据库
- 点击登录按钮,把获得的参数提交到LoginServlet
- 查询数据库,如果有此用户,登录成功
- 如果没有,登录失败
四,代码实现 ####
1.准备工作
1.1创建数据库和实体
- 数据库
create database web;
use web;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20)
);
INSERT INTO `USER` VALUES(null,'zhangsan','123456','Jack');
INSERT INTO `USER` VALUES(null,'lisi','123456','老王');
INSERT INTO `USER` VALUES(null,'wangwu','123','东方不败');
- 创建实体
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;
}
}
五,总结
1.url-pattern的配置
url-pattern配置方式共有三种:
1.完全路径匹配 :以 / 开始 ; /aa/bb
例如: /demo01 ,/login, /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
2.目录匹配:以 / 开始需要以 * 结束. ===>过滤器
例如: /* (所有) /aaa/* (aaa目录下的所有) /aaa/bbb/*
3.扩展名匹配 :不能以 / 开始, 以 * 开始的 .
例如:
*.do, *.jsp,*.jpg
错误的写法 : /*.do
缺省路径(系统自带的)
通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet
一个路径对应一个servlet,但是一个servlet可以有多个路径
tomcat获得匹配路径时,优先级顺序:1 >2 > 3 > 4
完全路径匹配> 目录匹配 > 扩展名匹配 > 缺省路径(tomcat里面的)
有如下的配置: <servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>com.cd.a_servlet.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/ServletDemo</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo1</servlet-name> <servlet-class>com.cd.a_servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo1</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>com.cd.a_servlet.ServletDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo2</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
2.配置servlet的启动加载项
Servlet**默认**是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置
<load-on-startup>int的值</load-on-startup>:值越小,优先级越高
3 开发中的路径的编写
3.1相对路径
不以/开头的, 都是需要找位置相对关系,要有一个完整的作为参照路径
./ 当前路径 , ../上一级目录
3.2绝对路径
以/开头的,不需要找位置相对关系
4.serveltConfig获得Servlet的配置信息
String getServletName(); —获得Servlet在web.xml中配置的name的值.
String getInitParameter(String name); —获得Servlet的初始化参数的.
Enumeration getInitParameterNames(); —获得所有Servlet的初始化参数的名称.