0x00前言

Servlet就是一个接口我们需要写一个类然后去实现Servlet,就可以被服务器识别到。request是用来接受客户端传过来的参数,respone是用来响应客户端的页面。我们所用的容器是一个继承的java容器tomcat。

0x01Servlet快速入门

0x1需要去实现接口Servlet接口实现方法

init方法Servlet创建的时候就会执行

Service方法每次Servlet被访问的时候就会执行

destroy方法每次服务器正常结束的时候就会执行,一般用于输出一些关于Servlet作者的信息

package webdemo1;

import javax.servlet.*;
import java.io.IOException; public class Servletdemo2 implements Servlet {
public Servletdemo2() {
super();
} @Override
public void init(ServletConfig servletConfig) throws ServletException {
//被创建的时候会会执行一次1
System.out.println("init执行了"); } @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//每次访问service访问的时候会被执行类似于固定代码块stati在类加载的时候也是,访问异常Servlet就会被执行一次
System.out.println("service 执行了"); } @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() {
//销毁方法,在服务器正常结束的时候执行一次
System.out.println("destroy执行了"); }
}

0x2配置Servlet服务

需要在web.xml里面配置Servlet服务

    <servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>webdemo1.Servletdemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
```,
但是如果Servlet多了以后配置文件会很复杂,3.0以后可以通过注解配置
`@WebServlet(urlPatterns = "/demo3")`这样配置直接访问。
####0x3Servlet的继承的关系
`public class Servletdemo4 extends GenericServlet`它把interface Servlet的方法都给实现了只留下了一个service是抽象方法。
`public abstract class HttpServlet extends GenericServlet`
`HttpServlet`是一个抽象类,它是去接受访问到的数据的我们平时用到的是doget和dopost对应两个提交方式做不同的处理

0x02request

0x1继承关系

 ServletRequest      --接口
丨继承
HttpServlet --接口
丨实现
org.apache.catalina.connector.RequestFacade 类(tomcat)

0x2Request

**GET**
String getMethod() 获取请求方式
String getContextPath() 获取虚拟目录
String gerQueryString() 获取参数
String getRequestURL()获取请求URL/demo1
StringBuffer getRequestURL()http://127.0.0.1/demo1
String getProtocol() 获取协议和版本
String getRemoteAddr() 获取目标可客户机的IP
String getHeader() 获取请求头
Enumeration<String> getHeaderNames 获取请求头名称
**通用形的获取参数**
String getParameter()获取请求参数
String[] parameterValues = request.getParameterValues("username");
for (String s:parameterValues) {
System.out.println(s)}根据参数名获取一个参数值的数组
Map<String, String[]> parameterMap = request.getParameterMap();//获取所有map集合
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> strings = parameterMap.keySet();
for (String name:strings
) {
String[] strings1 = parameterMap.get(name);
for (String value:strings1
) {
System.out.println(value); } }

0x02资源转发和数据共享

0x1转发的方法

1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

@WebServlet(name = "Servletdemo9", value = "/Servletdemo9")
public class Servletdemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demmo9被访问了");
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher("Servletdemo10");
requestRequestDispatcher.forward(request,response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response); }
} @WebServlet(name = "Servletdemo10", value = "/Servletdemo10")
public class Servletdemo10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demmo10被访问了");
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}

返回的结果是demmo9被访问了,demmo10被访问了

0x2转发的特点

1.浏览器的路径不会发生变化

2.只能访问服务器内部的资源

3.使用的是同一次请求

0x3共享数据

1.域对象:一个有作用范围的对象,可以在范围内共享数据。

2.request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

3.方法

void setAttribute(String name,Object obj):存储数据

Object getAttitude(String name):通过键获取值

void removeAttribute(String name):通过键移除键值对

4.演示

demo9去存放数据

        System.out.println("demmo9被访问了");
request.setAttribute("msg","hellow");//键值对的方式存数据
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher("Servletdemo10");
requestRequestDispatcher.forward(request,response);

demo10去访问数据

        System.out.println("demmo10被访问了");
Object msg = request.getAttribute("msg");
System.out.println(msg);

0x03response

0x1状态码

1xx:服务器收到客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码,催促继续发送

2xx:代表成功,200

3xx:重定向,代表:302(重定向)304(访问缓存)

4xx:客户端错误。代表:404(路径没有对应的资源)405请求方式没有对应doxxx的方法

5xx:服务端错误 服务器代码有错

0x2重要的响应头

Content-Type:服务器告诉客户端本次响应体的数据格式和编码格式

0x3设置response

1.设置响应行:setStatus(int sc)

2.设置响应头setHeader(String name,String value)

3.设置响应体

(1)获取输出流:字符输出流PrintWriter getWriter

(2)字节输出流:ServletOutputStream getOutputStream

4.路径设置

String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"Servletdemo11");//这样拼接路径以后好更改

0x4重定向的使用

重定向:

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

    转发:
  4. 转发地址栏路径不变
  5. 转发只能访问当前服务器下的资源
  6. 转发是一次请求,可以使用request对象来共享数据

    代码:
@WebServlet(name = "Servletdemo11", value = "/Servletdemo11")
public class Servletdemo11 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// **1xx**:服务器收到客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码,催促继续发送
// **2xx**:代表成功,200
// **3xx**:重定向,代表:302(重定向)304(访问缓存)
//**4xx**:客户端错误。代表:404(路径没有对应的资源)405请求方式没有对应doxxx的方法
// **5xx**:服务端错误 服务器代码有错
this.doPost(request,response); } @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Servletdemo11会自动访问Servletdemo12
System.out.println("demo被访问了");
response.setStatus(302);
response.setHeader("location","Servletdemo12"); }
}

demo2

重定向的方法response.sendRedirect("Servletdemo13");

@WebServlet(name = "Servletdemo12", value = "/Servletdemo12")
public class Servletdemo12 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servletdemo12被访问了");
response.getWriter().write("我的访问撒过了");
response.sendRedirect("Servletdemo13"); } @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response); }
}

0x5write

@WebServlet("/response")
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("gbk"); //设置编码
PrintWriter writer = resp.getWriter(); //获取输出对象
writer.write("response");//输出内容
writer.println("1235"); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
输出字节流:
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("abc".getBytes());

0x05ServletContext使用

1.概念:代表整个web应用,可以和程序的容器(服务器)来通信

2.获取

(1)通过request.getServletContext()

(2)通过HttpServletthis.getServletContext()

3.功能

(1)获取MIME:在互联网通信过程中定义的一种文件数据类型

格式:大类型/小类型 text/html image/jpeg

(2)域对象:共享数据

(3)获取文件的真实(服务器)路径

request.getServletContext();   : 通过request对象获取
this.getServletContext(); : 通过HttpServlet获取 String getMimeType(String file) : 获取MIME对象 域对象:共享数据 1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name) 获取文件的真实(服务器)路径: String getRealPath(String path)

简单的一个超链接下载案例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="puuture/cat.jpg">图片1查看</a>
<a href="puuture/cat2.jpg">图片2查看</a>
<hr>
<a href="Servletdownload?filename=cat.jpg">图片1下载</a>
<a href="Servletdownload?filename=cat2.jpg">图片2下载</a>
</body>
</html>

看一下Servlet

@WebServlet(name = "Servletdownload", value = "/Servletdownload")
public class Servletdownload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename"); //接收filename传参的值
ServletContext servletContext = this.getServletContext(); //创建servletContext 对象
String Path = servletContext.getRealPath("/puuture/" + filename); //获取文件真实路径
String mimeType = servletContext.getMimeType(filename);//获取mimel类型
FileInputStream fis = new FileInputStream(Path); //路径参数文件输入流对象中
response.setHeader("content-type",mimeType); //响应头设置mime类型
response.setHeader("content-disposition","attachment;filename="+filename); //设置为附件类型
ServletOutputStream outputStream = response.getOutputStream(); //获取文件输出流
byte[] buff = new byte[1024]; //设置每次读取的字节大小
int len =0;
while ((len = fis.read(buff))!=-1){
outputStream.write(buff,0,len);
} } }

0x06总结和归纳

总的来说Servlet(request和response)+Jdbc可以组成简单的后端基础处理了。仔细看最后一个案例可以学到很多东西。

java学习之Servlet的更多相关文章

  1. 【java学习】Servlet简单的表单程序(一)

    此文用于java学习,在此小记. 在此小Demo中使用到了Servlet,所以有必要了解一下Servlet的相关知识.(Servlet的相关知识摘抄自http://blog.csdn.net/jiuq ...

  2. Java学习之Servlet篇

    <JAVA遇见HTML——Servlet篇> Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命 ...

  3. java学习笔记—Servlet技术(11)

    如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servle ...

  4. JAVA学习 分析Servlet

    一个.什么是Servlet Servlet是一种在server端执行的java编写的程序,是依照Servlet规范编写的一个java类. 二.Servlet的工作过程 如图所看到的:为了实现客户与se ...

  5. Java Web基础 --- Servlet 综述(理论篇)

    摘要: Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.本文首先从请求/响应架构应用的大背景谈起 Servlet 的由来,明确 Ser ...

  6. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  7. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...

  8. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  9. Java学习05 (第一遍) - JSP与Servlet

    JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(jav ...

随机推荐

  1. C#基础_手动书写XML

    XML文档内容: 1.文档声明2.元素=标签 文档总至少要有一个根元素3.属性4.注释   <!--注释内容-->5.CDATA区.特殊字符 <![CDATA[不想解析的内容]]&g ...

  2. windows优化原神

    原神3.0新地图很卡顿? 锐距显卡带不动? 看一下我的配置 英特尔i5-1135G7 内存16GB可以拓展32GB 固态512GB 原神优化前帧率50左右 优化后59-60最差55 展示图原神设置图 ...

  3. 第四篇:理解vue代码

    解释以下代码: 实现输入框中能够打字的功能 <el-input v-model="input" placeholder="在这打字"></el ...

  4. 记pyautogui使用方法

    记录学习过程,本人喜欢简洁不啰嗦: 控制鼠标 1 pyautogui.moveTo(w - 100, h - 100, duration=0.25) # 立即移动到指定x, y位置坐标, durati ...

  5. RTSP播放器或RTMP播放器常用的Evnet事件回调设计

    很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...

  6. PostgreSQL逻辑复制解密

    在数字化时代的今天,我们都认同数据会创造价值.为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值.而在这 ...

  7. Redisson多策略注解限流

    限流:使用Redisson的RRateLimiter进行限流 多策略:map+函数式接口优化if判断 自定义注解 /** * aop限流注解 */ @Target({ElementType.METHO ...

  8. 在CentOS 8服务器上搭建FastDFS环境

    什么是FastDFS? 这里,我就摘录下百度百科上对于FastDFS的描述. FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下 ...

  9. 堆Pwn:House Of Storm利用手法

    0x00:介绍 利用手法的背景: house of storm是一种结合了unsorted bin attack和Largebin attack的攻击技术,其基本原理和Largebin attack类 ...

  10. prettierrc格式化常用配置

    #最大长度 printWidth: 140 #单引号 singleQuote: true tabWidth: 2 useTabs: false # 句尾添加分号 semi: false # js an ...