Servlet

server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别)

Servlet方法:

init方法:只执行一次,Servlet在第一次被访问时或者在服务器启动时被创建,就会执行init方法,

service方法:可以执行多次,每一次访问服务器就执行一次

destroy方法:在服务器被关闭前,就执行一次

ServletConfig getSerletConfig方法:获取ServletConfig对象

String getServletInfo:获取Servlet的一些信息

注解配置

在Servlet3.0之前需要这样web.xml来配置项目的路径

在Servlet3.0之后可以通过注解配置来选择项目路径了

Servlet的子类

servlet是一个接口,他有两个抽象子类GenericServlet和HttpServlet.

package com.Data.HttpServlet;

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;
//Http一共有其中请求方式
//可以使用HttpServlet的方法来判断请求方式
//继承HttpServlet
@WebServlet("/demo1")
public class HttpServletDemo extends HttpServlet{
//重写父类方法 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果是Get请求方式就执行此语句
System.out.println("doGet.....");//浏览器直接访问服务器的地址使用的是Get方式
} public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果是Post请求方式就执行此语句
System.out.println("doPost");//输出结果doPost
}
}

使用post方式访问服务器

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--指定地址demo3-->
<!--指定访问方式post-->
<form action="/demo1" method="post">
<input name="username" placeholder="请输入用户名">
<input type="submit" value="登录">
</form>
</body>
</html>

HTTP:

概念:Hyper Text Transfer Protocol 超文本传输协议,定义了客户端和服务器端通信时,发送数据的格式

请求消息数据格式

1.请求行 :

格式:请求方式(GET) 请求url(/Hello.html) 请求协议/版本(HTTP1.1)

当请求协议为GET时,请求的参数在请求行中,为POST时,请求的参数在请求体

2.请求头:就是我浏览器告诉服务器我有哪些信息

字符串格式:请求头名称:请求头值

常见的请求头:

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Referer: http://localhost:8080/Hello.html(我火狐浏览器不知道怎么会没有显示这个头.....),这个头可以告诉服务器我从哪里来

3.请求空行:就是一个空行,分隔请求头和请求体

请求体:封装POST请求消息的请求体参数的,username: zhangsan

Request原理:

1.request和response对象是由服务器创建的,

2.request对象是来获取请求消息,response对象是来设置响应消息

request对象继承体系结构:

ServletRequest(父接口)-->HttpServletRequest(子接口)--->RequestFacade(实现类)

request的功能

获取请求行的数据
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;
//演示Request对象获取请求行数据
@WebServlet( "/demo")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行的请求方式
//request对象有tomcat服务器创建
String method = request.getMethod();
System.out.println(method);//GET
//获取请求行的虚拟目录
String method1 = request.getContextPath();
System.out.println(method1);// /day13
//获取请求行的URI
String method2 = request.getRequestURI();
System.out.println(method2);// /day13/demo
//获取客户机的IP地址
String method3 = request.getRemoteAddr();
System.out.println(method3);// 0:0:0:0:0:0:0:1
//获取请求行的请求参数
String method4 = request.getQueryString();
System.out.println(method4);// name=zhangsan
}
}
获取请求头的数据
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;
import java.util.Enumeration; @WebServlet("/RDemo1")
public class RuquestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有请求头的名称
Enumeration<String> headerNames = request.getHeaderNames();
//遍历,相当于迭代器
//有下一个元素就为真
while(headerNames.hasMoreElements()){
//获取元素
String name = headerNames.nextElement();
//通过key找到value
String value = request.getHeader(name);
System.out.println(name+"------"+value); // 所有头,获取出来了
// host------localhost:8080
// connection------keep-alive
// upgrade-insecure-requests------1
// user-agent------Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
// accept------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
//accept-encoding------gzip, deflate, br
//accept-language------zh-CN,zh-HK;q=0.9,zh;q=0.8,en;q=0.7
//cookie------JSESSIONID=0329F34A83457E749B1818AFBE4C0A57; Idea-a0bb733=23efa255-9ce7-42d9-8d0b-9853348226b8; JSESSIONID=8FE68A2847DC38B4290ADBCE1BFD164F }
}
}
获取请求体数据

请求体:只有在POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

首先创建一个html文件,

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--绑定服务器的地址-->
<form action="/day13/RDemo1" method="post">
<input type="text" name="username"><br>
<input type="text" name="password"><br>
<!--向服务器提交数据-->
<input type="submit" value="注册">
</form>
</body>
</html>
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.BufferedReader;
import java.io.IOException; @WebServlet("/RDemo1")
public class RuquestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求体的请求参数
//获取字符流
BufferedReader reader = request.getReader();
String line=null;
while((line=reader.readLine())!=null){
//读取一行写一行
System.out.println(line);// username=zhangsan&password=123
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

其他功能:

获取请求参数通用方式,不论是get请求还是post请求都可以使用下列方法来获取参数值

1.String getParameter(String name):根据参数名称获取参数值

2.String[] getParameterValues(String name):根据参数名称获取参数值的数组

3.Enumeration getParameterNames();获取所有请求的参数名称

4.Map<String,String[]> getParameterMap():获取所有参数的map集合(与3不同的地方是,3所获得的键值对,是一个键只获取一个值,4方法的话一个键可以对应对个值)

Map方法的 演示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--绑定服务器的地址-->
<!--//不论是post请求还是get请求都一样-->
<form action="/day13/Demo3" method="GET">
<input type="text" name="username"><br>
<input type="text" name="password"><br>
<input type="checkbox" name="hobby" value="打游戏">打游戏
<input type="checkbox" name="hobby" value="看电影">看电影
<!--向服务器提交数据-->
<input type="submit" value="注册">
</form>
</body>
</html>
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;
import java.util.Map;
import java.util.Set; @WebServlet("/Demo3")
//不论是GET请求还是POST请求都可以使用下面的方法获取请求的参数
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String,String[]> map = request.getParameterMap();
//把所有的键存到一个集合中
Set<String> strings = map.keySet();
for(String key : strings){
//获取出每一个键
System.out.println(key);
//获取出值的集合
String[] values = map.get(key);
//获取出每一个值
for(String key2 : values){
System.out.println(key2);
}
System.out.println("---------------");
} } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

笔记-JavaWeb学习之旅10的更多相关文章

  1. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  2. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  3. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  4. 笔记-JavaWeb学习之旅13

    验证码案列 昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键.这两个 ...

  5. 笔记-JavaWeb学习之旅11

    请求转发:一种在服务器内部的资源跳转方式 使用步骤 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) ...

  6. 笔记-JavaWeb学习之旅3

    数据库的设计 1.多表之间的关系 一对一 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键 一对多 在多的一方建立外键指向一的一方建立主键 多对多 多对多关系实现需要借助第三张中间表.中间表 ...

  7. 笔记-JavaWeb学习之旅

    junit单元测试 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 白盒测试:需要些代码,关注程序具体的执行流程 Junit使用: 白盒测试 ​ 步骤: 定义一个测试类(测试用例) 定义 ...

  8. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  9. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

随机推荐

  1. 海康DS NVR播放URL规则

    URL规定:rtsp://username:password@<address>:<port>/Streaming/Channels/<id>(?parm1=val ...

  2. error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

    1 这个error是什么原因造成的 cmake默认选择的是x86,即32位的生成子. 2 怎么解决这个error 在cmake ..的时候,在后面加上“-G "Visual Studio 1 ...

  3. Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

    小结: 1.红黑树:典型的用途是实现关联数组 2.旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质.为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些 ...

  4. some base knowledge

    har类型的长度被定义为一个8位字节,这很简单. short类型的长度至少为两字节.在有些计算机上,对于有些编译程序,short类型的长度可能为4字节,或者更长. int类型是一个整数的“自然”大小, ...

  5. 【Effective C++】让自己习惯C++

    条款01:视C++为一个语言联绑 C++的四个语言层次: C:C++是以C为基础的.基本数据类型.语句.预处理器.数组.指针等统统来自C. Oject-Oriented C++:面向对象这一特性包含了 ...

  6. 剑指Offer:反转链表【24】

    剑指Offer:反转链表[24] 题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题分析 这道题我才发现我是属于那种真的笨,图都画出来了流程写不出来.看了别人的代码,总觉得自己差一步. 这也 ...

  7. HZNU 2154 ldh发奖金【字符串】

    题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2154 思路 先判断不能拆分的情况 以为需要拆分成两个正整数 所以我们可以知道 只有个位的数字 是不能够拆 ...

  8. Label标签 自动触发onclick,点击内部的Input

    最近项目遇到了一个bug,点击外层元素会直接触发元素内部的input框.(外层元素用的是label包裹的).找了很久才发现是label标签造成的. label定义和用法: label 标签为 inpu ...

  9. UVA10561 Treblecross —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-10561 题意: 两个人玩游戏,轮流操作:每次往里面添加一个X,第一个得到XXX的获胜. 题解: 详情请看<训练指南&g ...

  10. 人生苦短之Python迭代器

     迭代 在Python中,如果给定一个list或者touple,我们可以通过for循环来遍历,将值依次取出,这种遍历称为迭代. 在Python中是通过for...in..来进行遍历的,在Java中则是 ...