java学习之Servlet

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

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执行了");

    }
}

需要在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的继承的关系
 class Servletdemo4 extends GenericServlet它把interface Servlet的方法都给实现了只留下了一个service是抽象方法。
 abstract class HttpServlet extends GenericServlet
`&#x662F;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7C7B;&#xFF0C;&#x5B83;&#x662F;&#x53BB;&#x63A5;&#x53D7;&#x8BBF;&#x95EE;&#x5230;&#x7684;&#x6570;&#x636E;&#x7684;&#x6211;&#x4EEC;&#x5E73;&#x65F6;&#x7528;&#x5230;&#x7684;&#x662F;doget&#x548C;dopost&#x5BF9;&#x5E94;&#x4E24;&#x4E2A;&#x63D0;&#x4EA4;&#x65B9;&#x5F0F;&#x505A;&#x4E0D;&#x540C;&#x7684;&#x5904;&#x7406;
 ServletRequest      --&#x63A5;&#x53E3;
              &#x4E28;&#x7EE7;&#x627F;
       HttpServlet      --&#x63A5;&#x53E3;
              &#x4E28;&#x5B9E;&#x73B0;
       org.apache.catalina.connector.RequestFacade &#x7C7B;(tomcat)
**GET**
String getMethod() &#x83B7;&#x53D6;&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;
String getContextPath() &#x83B7;&#x53D6;&#x865A;&#x62DF;&#x76EE;&#x5F55;
String gerQueryString() &#x83B7;&#x53D6;&#x53C2;&#x6570;
String getRequestURL()&#x83B7;&#x53D6;&#x8BF7;&#x6C42;URL/demo1
StringBuffer getRequestURL()http://127.0.0.1/demo1
String getProtocol() &#x83B7;&#x53D6;&#x534F;&#x8BAE;&#x548C;&#x7248;&#x672C;
String getRemoteAddr() &#x83B7;&#x53D6;&#x76EE;&#x6807;&#x53EF;&#x5BA2;&#x6237;&#x673A;&#x7684;IP
String getHeader() &#x83B7;&#x53D6;&#x8BF7;&#x6C42;&#x5934;
Enumeration<string> getHeaderNames &#x83B7;&#x53D6;&#x8BF7;&#x6C42;&#x5934;&#x540D;&#x79F0;
**&#x901A;&#x7528;&#x5F62;&#x7684;&#x83B7;&#x53D6;&#x53C2;&#x6570;**
String getParameter()&#x83B7;&#x53D6;&#x8BF7;&#x6C42;&#x53C2;&#x6570;
String[] parameterValues = request.getParameterValues("username");
        for (String s:parameterValues) {
            System.out.println(s)}&#x6839;&#x636E;&#x53C2;&#x6570;&#x540D;&#x83B7;&#x53D6;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x503C;&#x7684;&#x6570;&#x7EC4;
</string>
Map<string, string[]> parameterMap = request.getParameterMap();//&#x83B7;&#x53D6;&#x6240;&#x6709;map&#x96C6;&#x5408;
     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);

           }

       }
</string></string,></string,>

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&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
        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&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
}

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

1.浏览器的路径不会发生变化
2.只能访问服务器内部的资源
3.使用的是同一次请求

1.域对象:一个有作用范围的对象,可以在范围内共享数据。
2.request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
3.方法
void setAttribute(String name,Object obj):&#x5B58;&#x50A8;&#x6570;&#x636E;
Object getAttitude(String name):&#x901A;&#x8FC7;&#x952E;&#x83B7;&#x53D6;&#x503C;
void removeAttribute(String name):&#x901A;&#x8FC7;&#x952E;&#x79FB;&#x9664;&#x952E;&#x503C;&#x5BF9;
4.演示
demo9去存放数据

        System.out.println("demmo9&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
        request.setAttribute("msg","hellow");//&#x952E;&#x503C;&#x5BF9;&#x7684;&#x65B9;&#x5F0F;&#x5B58;&#x6570;&#x636E;
        RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher("Servletdemo10");
        requestRequestDispatcher.forward(request,response);

demo10去访问数据

        System.out.println("demmo10&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
        Object msg = request.getAttribute("msg");
        System.out.println(msg);

1xx:服务器收到客户端消息,但是没有接受完成,等待一段时间后,发送1xx多状态码,催促继续发送
2xx:代表成功,200
3xx:重定向,代表:302(重定向)304(访问缓存)
4xx:客户端错误。代表:404(路径没有对应的资源)405请求方式没有对应doxxx的方法
5xx:服务端错误 服务器代码有错

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

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");//&#x8FD9;&#x6837;&#x62FC;&#x63A5;&#x8DEF;&#x5F84;&#x4EE5;&#x540E;&#x597D;&#x66F4;&#x6539;

重定向:

@WebServlet(name = "Servletdemo11", value = "/Servletdemo11")
public class Servletdemo11 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        **1xx**:&#x670D;&#x52A1;&#x5668;&#x6536;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#x6D88;&#x606F;&#xFF0C;&#x4F46;&#x662F;&#x6CA1;&#x6709;&#x63A5;&#x53D7;&#x5B8C;&#x6210;&#xFF0C;&#x7B49;&#x5F85;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x540E;&#xFF0C;&#x53D1;&#x9001;1xx&#x591A;&#x72B6;&#x6001;&#x7801;&#xFF0C;&#x50AC;&#x4FC3;&#x7EE7;&#x7EED;&#x53D1;&#x9001;
//                **2xx**:&#x4EE3;&#x8868;&#x6210;&#x529F;&#xFF0C;200
//                **3xx**:&#x91CD;&#x5B9A;&#x5411;&#xFF0C;&#x4EE3;&#x8868;&#xFF1A;302(&#x91CD;&#x5B9A;&#x5411;&#xFF09;304(&#x8BBF;&#x95EE;&#x7F13;&#x5B58;&#xFF09;
//**4xx**:&#x5BA2;&#x6237;&#x7AEF;&#x9519;&#x8BEF;&#x3002;&#x4EE3;&#x8868;:404(&#x8DEF;&#x5F84;&#x6CA1;&#x6709;&#x5BF9;&#x5E94;&#x7684;&#x8D44;&#x6E90;&#xFF09;405&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;&#x6CA1;&#x6709;&#x5BF9;&#x5E94;doxxx&#x7684;&#x65B9;&#x6CD5;
//                **5xx**:&#x670D;&#x52A1;&#x7AEF;&#x9519;&#x8BEF; &#x670D;&#x52A1;&#x5668;&#x4EE3;&#x7801;&#x6709;&#x9519;
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Servletdemo11&#x4F1A;&#x81EA;&#x52A8;&#x8BBF;&#x95EE;Servletdemo12
        System.out.println("demo&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
        response.setStatus(302);
        response.setHeader("location","Servletdemo12");

    }
}

demo2
&#x91CD;&#x5B9A;&#x5411;&#x7684;&#x65B9;&#x6CD5;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&#x88AB;&#x8BBF;&#x95EE;&#x4E86;");
        response.getWriter().write("&#x6211;&#x7684;&#x8BBF;&#x95EE;&#x6492;&#x8FC7;&#x4E86;");
        response.sendRedirect("Servletdemo13");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);

}
}
@WebServlet("/response")
public class Response extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("gbk");   //&#x8BBE;&#x7F6E;&#x7F16;&#x7801;
        PrintWriter writer = resp.getWriter();  //&#x83B7;&#x53D6;&#x8F93;&#x51FA;&#x5BF9;&#x8C61;
        writer.write("response");//&#x8F93;&#x51FA;&#x5185;&#x5BB9;
        writer.println("1235");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
&#x8F93;&#x51FA;&#x5B57;&#x8282;&#x6D41;&#xFF1A;
ServletOutputStream outputStream = resp.getOutputStream();
        outputStream.write("abc".getBytes());

1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.获取
(1)通过request.getServletContext()
(2)通过HttpServletthis.getServletContext()
3.功能
(1)获取MIME:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html image/jpeg
(2)域对象:共享数据
(3)获取文件的真实(服务器)路径

request.getServletContext();   : &#x901A;&#x8FC7;request&#x5BF9;&#x8C61;&#x83B7;&#x53D6;
this.getServletContext();     : &#x901A;&#x8FC7;HttpServlet&#x83B7;&#x53D6;

String getMimeType(String file)  : &#x83B7;&#x53D6;MIME&#x5BF9;&#x8C61;

&#x57DF;&#x5BF9;&#x8C61;&#xFF1A;&#x5171;&#x4EAB;&#x6570;&#x636E;

1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)

&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x7684;&#x771F;&#x5B9E;(&#x670D;&#x52A1;&#x5668;)&#x8DEF;&#x5F84;&#xFF1A;

String getRealPath(String path)

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="puuture/cat.jpg">&#x56FE;&#x7247;1&#x67E5;&#x770B;</a>
<a href="puuture/cat2.jpg">&#x56FE;&#x7247;2&#x67E5;&#x770B;</a>
<hr>
<a href="Servletdownload?filename=cat.jpg">&#x56FE;&#x7247;1&#x4E0B;&#x8F7D;</a>
<a href="Servletdownload?filename=cat2.jpg">&#x56FE;&#x7247;2&#x4E0B;&#x8F7D;</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");  //&#x63A5;&#x6536;filename&#x4F20;&#x53C2;&#x7684;&#x503C;
        ServletContext servletContext = this.getServletContext();   //&#x521B;&#x5EFA;servletContext &#x5BF9;&#x8C61;
        String Path = servletContext.getRealPath("/puuture/" + filename);  //&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x771F;&#x5B9E;&#x8DEF;&#x5F84;
        String mimeType = servletContext.getMimeType(filename);//&#x83B7;&#x53D6;mimel&#x7C7B;&#x578B;
        FileInputStream fis = new FileInputStream(Path);   //&#x8DEF;&#x5F84;&#x53C2;&#x6570;&#x6587;&#x4EF6;&#x8F93;&#x5165;&#x6D41;&#x5BF9;&#x8C61;&#x4E2D;
        response.setHeader("content-type",mimeType);  //&#x54CD;&#x5E94;&#x5934;&#x8BBE;&#x7F6E;mime&#x7C7B;&#x578B;
        response.setHeader("content-disposition","attachment;filename="+filename); //&#x8BBE;&#x7F6E;&#x4E3A;&#x9644;&#x4EF6;&#x7C7B;&#x578B;
        ServletOutputStream outputStream = response.getOutputStream();   //&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x8F93;&#x51FA;&#x6D41;
        byte[] buff = new byte[1024];   //&#x8BBE;&#x7F6E;&#x6BCF;&#x6B21;&#x8BFB;&#x53D6;&#x7684;&#x5B57;&#x8282;&#x5927;&#x5C0F;
        int len =0;
        while ((len = fis.read(buff))!=-1){
            outputStream.write(buff,0,len);
        }

    }

    }

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

Original: https://www.cnblogs.com/0x3e-time/p/16226896.html
Author: 不成大哥不改名
Title: java学习之Servlet

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643132/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [教程] 【亲测可用】阿里云盘挂载变成你的电脑本地硬盘详细教程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    0102
  • ConstraintLayout的用法

    <span class=”typ”>ConstraintLayout</span> 相对于 <span class=”typ”>Relative…

    技术杂谈 2023年5月31日
    090
  • log4j配置输出到多个日志文件

    通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件中。那么我们log4j为我们提供了这种功能,以下我们来一步一步看是怎么做的。这里以prope…

    技术杂谈 2023年5月31日
    096
  • target 1

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    076
  • 解决Mybatis-plus高版本不向后兼容的问题

    mybatis-plus插件后面的版本没有兼容低版本。即:不存在低版本中EntityWrapper这个类了。而该类采用数据库表真实字段名作查询条件,这样硬编码形式确实不友好,比如如…

    技术杂谈 2023年7月11日
    054
  • C7N 操作当前 table cell

    场景: 在 C7N table 组件中,实现 cell 中的内容,双击展开或收起 思路: 通过 onCell 方法实现 方案: Original: https://www.cnbl…

    技术杂谈 2023年5月30日
    0100
  • 经典算法学习-计算汉明权重 SWAR(SIMD within a register)

    计算汉明权重算法 SWAR(SIMD within a register) 参考文章: [1] 简书:计算汉明权重的SWAR(SIMD within a Register)算法ht…

    技术杂谈 2023年6月21日
    081
  • react新手demo——TodoList

    今天我们就使用 react 来实现一个简易版的 todolist ,我们可以使用这个 demo 进行 list 的增删改差,实际效果如上图所示。大家可以 clone下来查看:rea…

    技术杂谈 2023年5月31日
    091
  • SSH 三步解决免密登录

    本地客户端生成公私钥:(一路回车默认即可) ssh-keygen 上面这个命令会在用户目录.ssh文件夹下创建公私钥 cd ~/.ssh ls 下创建两个密钥: 这里测试用的服务器…

    技术杂谈 2023年5月31日
    084
  • NoteOfMySQL-14-日志管理

    一、MySQL日志 日志是MySQL数据库的重要组成部分,日志文件记录了MySQL数据库的日常操作和错误信息,可以通过分析这些日志文件了解MySQL数据库的运行情况。MySQL数据…

    技术杂谈 2023年7月11日
    093
  • SpringMVC 使用注解时路径找不到

    SpringMVC 注解路径找不到 今天在使用SpringMVC时偶然遇到了跳转 404 的问题,于是决定记录下来 启动后输入 @RequestMapping(“/lo…

    技术杂谈 2023年7月11日
    065
  • Netty源码分析之ChannelPipeline(四)—出站事件的传播

    上篇文章中我们梳理了ChannelPipeline中入站事件的传播,这篇文章中我们看下出站事件的传播,也就是ChannelOutboundHandler接口的实现。 1、出站事件的…

    技术杂谈 2023年7月25日
    070
  • 你的哪些骚操作会导致SegmentationFault😂

    你的哪些骚操作会导致Segmentation Fault😂 前言 如果你是一个写过一些C程序的同学,那么很大可能你会遇到魔幻的 segmentation fault,可能一时间抓耳…

    技术杂谈 2023年7月23日
    073
  • Java基础学习笔记(2)

    二、流程控制 1、用户交互Scanner java.util.Scanner是Java5的新特性, 我们可以通过Scanner类来获取用户输入。 *基本语法: Scanner s …

    技术杂谈 2023年7月24日
    077
  • nodejs集群

    nodejs集群 单个 Node.js 实例运行在单个线程中。 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务。 集群中的Master 现在让我们详细了…

    技术杂谈 2023年5月31日
    082
  • axios的兼容性问题

    1、axios在PC端浏览器的兼容性问题 axios支持IE8+,但原理是基于promise之上实现的,因此会存在不兼容IE的问题。 trident内核的浏览器下会报:vuex r…

    技术杂谈 2023年5月31日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球