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协议:超文本传输协议(HTTPHyperText 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

 

【请求行】

请求方式请求路径 协议版本

* 请求方式:请求方式有很多种 常用的是GETPOST.

* GETPOST区别?

     * 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...");

}

...

}

 

* 配置ServletWEB服务器.

  <!-- 配置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方法就会执行.任何一次从客户端发送的请求,那么服务器创建一个新的线程执行Servletservice方法为这次请求服务.

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(){

// 获得ids1的元素:

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域中.配置Servletload-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>

 

Servletinit方法中初始化次数为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项目的文件.

原创粉丝点击