servlet 参考
来源:互联网 发布:淘宝html源代码 编辑:程序博客网 时间:2024/06/07 13:50
Servlet
今日任务
Ø 完成系统的登录的功能
Ø 完成登录系统后页面定时跳转
Ø 记录系统登录成功后,系统被访问多少次
教学导航
教学目标
了解HTTP协议
掌握Servlet的编写
了解ServletConfig的使用
掌握ServletContext对象的使用
教学方法
案例驱动法
1.1 HTTP协议
1.1.1 HTTP协议:
1.1.1.1 协议的概念:
规定被约束的对象需要遵守的规则!!!
1.1.1.2 HTTP协议:
HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
HTTP协议规定 浏览器(客户端)向服务器发送 何种格式的数据. 服务器 会处理数据.向浏览器(客户端)作出响应.(向客户端发送何种格式的数据)
HTTP协议的特点:
* HTTP协议遵守一个请求响应模型.
* 请求和响应必须成对出现.
* 必须先有请求后有响应.
* HTTP协议默认的端口:80
1.1.1.3 HTTP协议的请求部分
客户端向服务器发送的数据的格式:
GET请求方式的抓包:
GET /WEB09/demo1/subSucc.html?username=aaa&password=123 HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 63397-10023
Referer: http://localhost:8080/WEB09/demo1/demo1.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
POST方式的抓包:
POST /WEB09/demo1/subSucc.html HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 63397-10049
Referer: http://localhost:8080/WEB09/demo1/demo1.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 25
Connection: Keep-Alive
Cache-Control: no-cache
username=aaa&password=123
【请求行】
请求方式请求路径 协议版本
* 请求方式:请求方式有很多种 常用的是GET和POST.
* GET和POST区别?
* GET:请求参数会显示到地址栏.GET方式有大小的限制.GET方式没有请求体
* POST:请求参数不会显示到地址栏.在请求体中.POST没有大小限制.POST方式有请求体.
* 只有表单设置为method=”post”才是post请求.其他的都是get请求
【请求头】
* 请求头通常都是key:value的键值对的形式.一般情况下一个key对应一个value但也有一个key对应多个value的情况.
* Referer:网站的来源.防盗链.
* User-Agent:获得客户端浏览器的信息.(文件下载:IE:URL编码 火狐Base64)
* If-Modified-Since:和响应中一个头一起使用 完成本地缓存的查找.
【请求体】
POST方式 提交的请求参数
1.1.1.4 HTTP协议的响应部分
服务器向客户端发送的数据的格式:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"147-1455670867735"
Last-Modified: Wed, 17 Feb 2016 01:01:07 GMT
Content-Type: text/html
Content-Length: 147
Date: Wed, 17 Feb 2016 01:17:06 GMT
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>鎻愪氦鎴愬姛</h1>
</body>
</html>
【响应行】
协议版本状态码 状态码描述
200:响应成功
302:重定向
304:查找本地缓存
404:浏览资源不存在.
500:服务器内部错误.
【响应头】
一个key对应一个value,也有一个key对应多个value的头.
Last-Modified:最后的修改文件的事件.与If-Modified-Since一起使用.
Refresh:定时刷新.
Location:重定向的路径.
Content-Disposition:文件下载的时候使用的头信息.
禁用浏览器缓存:
Pragma
Expires
Cache-Control
【响应体】
页面要显示的内容.
1.2 案例一:商城的登录的功能的实现:
1.2.1 需求:
网上商城有一个登录的功能.
1.2.2 分析
1.2.2.1 技术分析
【Servlet的概述】
Ø 什么是Servlet:
是运行在服务器端的一小的Java程序,接收和响应从客户端发送请求.
Ø Servlet的作用:
处理客户端的请求,并且对请求作出响应.
Ø 使用Servlet:
Servlet的入门:
* 编写一个类实现Servlet接口.
public class ServletDemo1 implements Servlet{
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// System.out.println("");
response.getWriter().println("Hello Servlet...");
}
...
}
* 配置Servlet到WEB服务器.
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称-->
<servlet-name>aaa</servlet-name>
<!-- Servlet的类的全路径-->
<servlet-class>com.itheima.servlet.demo1.ServletDemo1</servlet-class>
</servlet>
<!-- 配置Servlet的映射-->
<servlet-mapping>
<!-- Servlet的名称-->
<servlet-name>aaa</servlet-name>
<!-- Servlet的访问路径-->
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>
1.2.2.2 步骤分析:
Ø 步骤一:设计一个登录页面.
Ø 步骤二:在登录页面上点击登录按钮.提交到Servlet.
Ø 步骤三:编写Servlet.在Servlet中接收参数.
Ø 步骤四:调用业务层去数据库进行查询.
Ø 步骤五:根据处理结果作出响应.
1.2.3 代码实现:
1.2.3.1 创建数据库
create database web09;
use web09;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date,
hobby varchar(50)
);
insert into user values (null,'tom','123','tom@126.com','tom','1','1988-01-01',null);
1.2.3.2 导入页面:
1.2.3.3 代码实现:
1.引入jar包(mysql,c3p0,dbutils)
2.创建包和类
3.创建一个工具类JDBCUtils
4.编写Servlet,Service,DAO
1.2.4 总结:
1.2.4.1 Servlet的生命周期(*****)
Ø 生命周期:
指的是一个对象从创建到销毁的过程.
Servlet的生命周期,Servlet对象从创建到销毁的过程.
客户端第一次访问该Servlet的时候才会创建一个Servlet的对象,那么Servlet中的init方法就会执行.任何一次从客户端发送的请求,那么服务器创建一个新的线程执行Servlet中service方法为这次请求服务.
service方法的内部根据请求的方式的不同调用不同doXXX的方法.当Servlet从服务器中移除或者关闭服务器的时候Servlet对象就会被销毁.destroy的方法就会执行.
1.2.4.2 Servlet的接口的实现:
Servlet接口
|
GenericServlet通用的Servlet
|
HttpServletHttpServlet
1.2.4.3 配置Servlet的启动时加载:
在web.xml中<servlet>标签中配置
<load-on-startup>2</load-on-startup>
1.2.4.4 配置url-pattern
【完全路径匹配】
* 以/开头 如:/aaa /aaa/bbb
【目录匹配】
* 以/开头 以*结尾 如:/* /aaa/* /aaa/bbb/*
【扩展名匹配】
* 不能以/开始的 需要以*开始 如:*.jsp *.do *.action
完全路径匹配 >目录匹配 > 扩展名匹配
练习:
有如下的一些映射关系:
Servlet1映射到 /abc/*
Servlet2映射到 /*
Servlet3映射到 /abc
Servlet4映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2.
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
1.2.4.5 WEB开发中的路径的问题:(*****)
相对路径:不是以/ 开始的路径.
* localhost:8080/WEB09/servletDemo5
* localhost:8080/WEB09/demo2/demo1.html
绝对路径:
通常都是以 /开始的路径.
带工程名的路径(客户端的路径):
不带工程名的路径(服务器端路径):
1.3 案例二:系统登录成功后页面5秒后跳转到成功页面
1.3.1 需求
网站登录成功后,隔5秒钟页面自动跳转到成功的页面.
1.3.2 分析:
1.3.2.1 技术分析:
【Refresh的响应头】
HttpServletResponse的操作响应头的方法:
* addHeader(String name,String value); --针对一个key对应多个value头的设置
* addDateHeader(String name,long value);
* addIntHeader(String name,int value);
* setHeader(String name,String value); --针对一个key对应一个value
* setDateHeader(String name,long value);
* setIntHeader(String name,int value);
1.3.2.2 步骤分析:
步骤一:在登录成功后的代码的地方设置响应头
步骤二:编写一个成功后的跳转的页面.
1.3.3 代码实现:
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<h1>登录成功!页面将在5秒后跳转</h1>");
response.setHeader("Refresh", "5;url=/WEB09/loginSucc.html");
1.3.4 总结:
1.3.4.1 多学一招:
可以通过html页面中的一个标签设置头信息<meta>标签.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Refresh" content="5;url=/WEB09/succ.html">
<script type="text/javascript" src="/WEB09/js/jquery-1.11.3.min.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
$(function(){
setInterval("changeTime()", 1000);
});
var i = 5;
function changeTime(){
// 获得id为s1的元素:
i--;
$("#s1").html(i);
}
</script>
</head>
<body>
<h1>登录成功!!!页面将在<span id="s1">5</span>秒后跳转!</h1>
</body>
</html>
1.4 案例三:统计一下网站被登录的总次数.
1.4.1 需求:
系统已经完成的登录的基本功能,并且登录后页面5秒后跳转到成功页面.想在成功页面中显示被登录成功的次数.
1.4.2 分析:
1.4.2.1 技术分析
【ServletContext*****】
ServletContext:Servlet中全部的内容ServletContext都了解.一个WEB应用只有一个ServletContext对象.服务器启动的时候,服务器为每个WEB工程创建一个属于自己项目的ServletContext对象.服务器关闭的时候或者项目从服务器中移除ServletContext才会被销毁.如果将值保存在ServletContext中.值就有一个作用的范围.所以这个对象称为”域对象”.
* 保存全局性信息和数据:
* 网站的访问次数:
* 聊天室:
* 在Servlet中获得ServletContext:
* ServletContext getServletContext();
* 操作这个对象的方法:
* void setAttribute(String name,Object value);
* Object getAttribute(String name);
* void removeAttribute(String name);
1.4.2.2 步骤分析:
步骤一:编写一个Servlet中的init方法.在init方法中初始化一个被登录次数0.将这个值存入到ServletContext域中.配置Servlet的load-on-startup.
步骤二:在登录成功代码中获得原来的次数+1.存回到ServletContext域中.
步骤三:在5秒后跳转的Servlet中,从ServletContext域中获得次数,并且显示到页面上.
1.4.3 代码实现:
配置SErvlet为启动时加载:
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.itheima.servlet.demo2.UserServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
在Servlet的init方法中初始化次数为0
@Override
public void init() throws ServletException {
// super.init();
// 获得ServletContext对象.初始化一个值为0.
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("count", 0);
}
在登录成功的代码中获得原来的次数并且+1,存回到SErvletContext域中。
// 登录成功的时候 获得原来的次数 + 1
Integer count = (Integer) this.getServletContext().getAttribute("count");
// 存回到ServletContext域中
this.getServletContext().setAttribute("count", ++count);
在CountServlet中获得次数并且显示:
response.setContentType("text/html;charset=UTF-8");
// 获得次数:
Integer count = (Integer) this.getServletContext().getAttribute("count");
response.getWriter().println("<h1>您是第"+count+"位登录成功的用户!</h1>");
1.4.4 总结:
1.4.4.1 ServletConfig:(了解)
这个对象可以获得到Servlet的配置信息:
String servletName = this.getServletConfig().getServletName();
System.out.println(servletName);
// 获得初始化参数:
String username = this.getServletConfig().getInitParameter("username");
String password = this.getServletConfig().getInitParameter("password");
System.out.println(username+" "+password );
// 获得所有初始化参数的名称
Enumeration<String> names = this.getServletConfig().getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = this.getServletConfig().getInitParameter(name);
System.out.println(name+" "+value);
}
1.4.4.2 ServletContext:
1.获得文件的MIME的类型. --文件上传和下载.
2.获得全局初始化参数:
3.作为域对象存取数据:
4.读取WEB项目的文件:(***)
使用类加载器获得web项目的文件.
- servlet 参考
- JSP Servlet参考
- Servlet处理登陆响应参考代码
- 简单Web应用例子 参考Head First servlet jsp
- 参考
- 参考
- 参考
- 参考
- 参考
- 参考
- 参考。。。
- 参考
- 参考
- 参考
- 参考
- 参考
- 参考
- 参考
- C# WinForm 判断本机是否联网
- python安装numpy和pandas
- 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号
- C++ 多态 (纯)虚函数 虚函数表解析
- 雪花
- servlet 参考
- Android Studio生成自定义jar包(同时将assets目录打入jar包)
- IOS逆向--ARM/THUMB解读
- Windows下Git的安装和基本使用方法
- 从面试实习来产品经理与技术岗的一些区别和注意事项
- delphi窗体继承
- iOS资源库AssetsLibrary
- 最大子序列分治实现以及改进
- 时间戳转换