20201030黄春跃
20201030黄春跃
知识点
Servlet
Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器
的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容(HTML)。
使用Servlet 2.5实现
Servlet与普通java程序的区别
- 必须实现servlet接口
- 必须在servlet容器(服务器)中运行
- servlet程序可以接收用户请求参数以及向浏览器输出数据
抽象方法
void init(ServletConfig var1) :初始化 servlet ,由servlet容器调用,以指示servlet正在
将servlet放入服务中。servlet容器在实例化servlet后仅调用init方法一次。在servlet可以接收任何
请求之前,init方法必须成功完成。
ServletConfig getServletConfig() :返回一个ServletConfig对象,其中包含该servlet的初
始化和启动参数
void service(ServletRequest req, ServletResponse res) :由servlet容器调用,以允许
servlet响应请求。此方法仅在servlet的init()方法成功完成后调用。
String getServletInfo() :以纯文本的方式返回关于servlet的信息,如作者、版本和版权
void destroy() :servlet销毁时调用
实现Servlet接口,创建类
创建一个 servlet 三个步骤:
- 创建一个class实现servlet接口
- 实现方法
- 创建的类在 web.xml 文件中做配置(将请求路径和java程序的对应关系建立起来)
1.新建一个类,实现 Servlet 接口。代码如下:
package com.itlaobing.demo;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Demo01 implements Servlet{
@Override
public void destroy() {
System.out.println("Demo01 --> service()");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Demo01 --> init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("Demo01 --> service()");
}
}
2.在 web.xml 文件(在web/WEB-INF 文件夹下)中配置,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>MyServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Demo01</servlet-name>
<servlet-class>com.itlaobing.demo.Demo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo01</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
其中:
1. url-pattern定义URL
2. servlet-class定义servlet的路径
3. url-pattern和servlet-class通过servlet-name建立映射关系
使用Servlet3.0实现
Servlet2.5与Servlet3.0区别
Servlet3.0相较于Servlet2.5:
新增了一些注解,简化的javaweb代码开发,可以省略 web.xml 配置,支持异步处理(多线程技术) 支
持可插性特性(书写的代码编译后生成的class文件可以直接部署到其他项目的,自动加载执行)
1. 创建JavaEE6(含6)以上的工程
2. 创建 servlet ,在 @WebServlet 注解中添加 urlPatterns = "/hello" ,作为请求路径
http请求信息的组成部分
前边我们学习了 http 请求,现在我们来学习请求信息的组成,通过学习请求信息了解浏览器将哪些数
据,按照什么样的格式发送给服务器。
http 请求一共分为三个部分:请求行,请求头,请求体。
http协议get请求方式:
- 创建一个工程,在web文件夹中创建一个1.html,内容为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo/1.html" method="post">
<input type="text" name="username" /><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
http协议post请求方式:
- http协议post请求方式,填写输入框,并点击提交。
请求行
请求行:POST /demo/1.html HTTP/1.1
POST :请求方式
/demo/1.html :访问路径
HTTP/1.1 :http协议的版本
request获取请求行信息
请求行的组成元素(通过request获取请求行数据)
在http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在
HttpServletRequest 概述中我们知道浏览器与请求相关的数据封装在 request 中,因此,接下来我
们学习如何使用request对象获取请求行的数据。
常用方法
- String getMethod() 获取请求方式的类型
- String getRequestURI() 获取请求行中的资源名部分
- StringBuffer getRequestURL() 获取客户端发出请求完整URL
注:
uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)
url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资
源. (相当于身份证中的地址) - String getProtocol() 获取当前协议的名称和版本
- String getRemoteAddr() 获取IP地址
- int getLocalPort() 获取端口
示例
-
创建 DemoServlet 类,继承 HttpServlet
-
在 DemoServlet 中的 doGet 或者 doPost 方法的参数列表,已经包含了 request 对象,调用方法
即可。 -
将数据打印在控制台
代码:
package com.itlaobing.demo.servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Classname com.itlaobing.demo.servlet.DemoServlet
* @Description TODO()
* @Date 2019/11/14 23:40
* @Author by Administrator
* @Version v1.0
*/
@WebServlet(name = "DemoServlet", urlPatterns = "/demo")
public class DemoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
/**
* 1. String getMethod() 获取请求方式的类型
* */
String method = request.getMethod();
System.out.println("获取请求方式的类型: " + method);
/**
* 2. String getRequestURI() 获取请求行中的资源名部分
* */
String requestURI = request.getRequestURI();
System.out.println("获取请求行中的资源名部分:" + requestURI);
/**
* 3. StringBuffer getRequestURL() 获取客户端发出请求完整URL
* */
StringBuffer getRequestURL = request.getRequestURL();
System.out.println("获取客户端发出请求完整URL:" + getRequestURL);
/**
* 4. String getProtocol() 获取当前协议的名称和版本
* */
String getProtocol = request.getProtocol();
System.out.println("获取当前协议的名称和版本:" + getProtocol);
/**
* 5. String getRemoteAddr() 获取IP地址
* */
String getRemoteAddr = request.getRemoteAddr();
System.out.println("获取IP地址:" + getRemoteAddr);
/*** 6. int getLocalPort() 获取端口
* */
int localPort = request.getLocalPort();
System.out.println("获取端口:" + localPort);
}
}获取请求方式的类型: GET 获取请求行中的资源名部分:/demo/demo
获取客户端发出请求完整URL:http://127.0.0.1:8080/demo/demo
获取当前协议的名称和版本:HTTP/1.1
获取IP地址:127.0.0.1
获取端口:8080再次访问:http://localhost:8080/demo/demo,结果如下:
获取请求方式的类型: GET 获取请求行中的资源名部分:/demo/demo
获取客户端发出请求完整URL:http://localhost:8080/demo/demo
获取当前协议的名称和版本:HTTP/1.1
获取IP地址:0:0:0:0:0:0:0:1
获取端口:8080
观察两次打印的IP地址会发现不一样,因此,注意localhost和127.0.0.1效果一致,但是localhost
默认使用ipv6本机地址——0:0:0:0:0:0:0:1,而127.0.0.1是ipv4的本机地址。
request获取请求头信息
常用方法
- String getHeader(String name) 以String 的形式返回指定请求头的值
- Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举
request的其他方法
获取上下文路径(工程名字)
String getContextPath() 获取上下文路径(工程名字)
今日总结:
晚自习看了看今天学的内容,敲代码花了太多的时间就没来得及完成作业。
近期评论