JavaWeb —— Servlet(看这篇就够了,通俗易懂快速掌握)_package servlet;_三月水_的博客-程序员秘密

技术标签: java  开发语言  

前言:

Serlet是什么?

Servlet是服务端的小组件是一门动态获取页面资源的技术,是Java语言编写的一个类,Servlet运行在Web服务器中,他是由服务端调用以及执行的,学号Servlet是非常有必要的,Servlet是MVC的基石。

Servlet的快速入门

1 编写一个Java类去实现核心接口Servlet即可(要重写Servlet中的五个方法)

package servlet;

import javax.servlet.*;
import javax.servlet.Servlet;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @author 三月水
 * version  0.5
 */

@WebServlet("/dem1")//配置访问路径(精准匹配)
public class HelloServlet implements Servlet {

    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init().....");
    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
     
        System.out.println("hello Servlet");
        
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
        System.out.println("destroy()....");
    }
}

2  在pom.xml中导入Servlet相关的依赖包,Servlet3.0之后支持注解开发(通过注解的方式来访问)

3 在init()和servise()方法中写入自己的逻辑

4 配置@WebServlet("/xxx")//配置访问名(精准匹配)

5 启动Web服务器

填写刚刚在@WebServlet("/xxx")中填入的访问名访问即可

访问结果

 Servlet生命周期

实现核心接口Servlet会重写5个方法其中三个是关于生命周期的方法

1. init(); 初始化阶段
//客服端浏览器第一次访问Servlet时,Web服务器会调用init()完成对Servlet的初始化
2. service() 处理浏览器请求阶段
// 客户端浏览器每一次访问请求Servlet时,Web服务器会调用Servlet中的Servise()对请求进行处理
3. destroy()终止阶段
 //Web服务器关闭或者是重启会调用该方法对Servlet进行销毁

 HttpServlet

在实际发开中往往会继承该类对Servlet进行开发

演示案列

1 编写一个类去继承HttpServlet

2 重写doGet 和 doPost方法 并且加上自己的逻辑

3 用注解的方式配置访问名(@WebServlet("/xxx"))

package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo11")//用注解的方式访问
public class Servlet extends HttpServlet {//继承该类重写核心方法

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

        System.out.println("doGet....");
    }

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

        System.out.println("doPost....");
       
    }
}

4 运行Web服务器在url中输入注解中的访问名(默认是get)

IDEA中开发Servlet

在开发当中Servlet是经常会使用到的,手动的编写效率不高且繁琐,IDEA中有个模板我们可以设置下,就可以不用每次都手动敲了

 

 点击应用确定就完成了

 每次我们需要对Servlet开发时只需点击这个输入你的类名确认即可

 Servlet urlPattern 配置

注解的访问种类

1 精准匹配

@WebServlet("/demo1") ;//url路径也必须与访问名一致才能访问到 不然会报404异常

2 扩展名匹配

@WebServlet("/xxx.jar") ;//url路径写以.jar结尾的访问名都可访问该资源

3 目录匹配

@WebServlet("/ok / * ") ;//url路径写/ok/xxx都可以访问到该资源

4 任意匹配 

@WebServlet("/ ") ;//url路径写任意的都可以访问该资源

 @WebServlet("/ *") ;//url路径写任意的都可以访问该资源

 小结 :

Servlet 配置了 "/", 会覆盖 tomcat DefaultServlet, 当其他的 utl-pattern 都匹配
不 上 时 , 都 会 走 这 个 Servlet, 这 样 可 以 拦 截 到 其 它 静 态 资 源, 不推荐使用任意匹配,会匹配到任意的请求,比较麻烦需要避免 ,推荐使用精准匹配

HttpServletRequest

核心对象 是对客户端请求的处理

常用的方法

1 getMehod() ; //获取请求方式

2 getParament() ; //获取请求参数

3 getParamentValue() ; //获取请求参数数组(多个值)

4 getParamentMap() ; //通过集合Map获取请求参数

5 getHeader() ; //获取请求头

6 getRequstURL() ; //获取请求路径(绝对路径)

7 getContextURL() ; //获取虚拟路径

8 setAttribute(key,value) ; //设置域数据

9 getAttribute(key) ; //获取域数据

   

Request请求参数乱码问题

post请求的处理: 

在获取参数前

request.setCharacterEncoding("utf-8");//设置字符集

get请求参数的处理相对post要复杂 主要的流程

1 获取参数前进行URL编码,获取参数后进行解码 即可

String name = "张三" ;

1 进行URL编码

String encode = URLEncoder.encode(name, "utf-8");

2 进行URL解码

String decode = URLDecoder.decode(encode, "utf-8");

请求转发

实现请求转发:请求转发指一个 web 资源收到客户端请求后,通知服务器去调用另外
一个 web 资源进行处理(打个比方 小明叫小李去买水,小李收到消息后又叫了小刘去买水

核心的方法

request.getRequstDisparcher("访问名").forward(request,response);

//获取请求转发核心对象

setAttribute(key,value);//设置域数据
getAttribute (key); //获取域数据
removeAttribute();删除域数据        

快速上手

1 编写两个Servlet类继承HttpServlet 重写对应的两个核心方法(doGet和doPost)

2 用注解的方式访问

package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo33")
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setAttribute("ab","管理员");//设置共享数据

        //编写请求转发核心方法
        request.getRequestDispatcher("demo44").forward(request,response);

    }

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

package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo44")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object ab = request.getAttribute("ab");//获取共享数据
        System.out.println("ab :" + ab);
    }

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

2 启动Web服务器输入访问名demo33即可

小结:

为什么需要请求转发?请求转发在一次会话一次请求中共享同一个域的数据,url访问地址不变,不能访问当前 Web 工程外的资源。

HttpServletResponse

对客服端的请求进行响应

向客户端返回数据的方法

getOutpuStream();//处理二进制文件(照片,音频,视频)

getWriter();//处理纯文本

演示案例

package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo21")
public class Response extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符集不然出现乱码情况
        response.setContentType("text/html;charset:utf-8");
        
        //向控制台打印数据
        PrintWriter writer = response.getWriter();
        writer.print("<h1 > Hello Word ~ </h1>");
        writer.print("hello Response.....");
    }

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

启动web服务器url中写入访问名回车即可 输出结果 

请求重定向

请求重定向指:一个 web 资源收到客户端请求后,通知客户端去访问另外一个 web
资源,这称之为请求重定向
核心方法
response.getsendRedirect("url" );
快速上手
package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo55")
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.sendRedirect("demo66");//重定向

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse  response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
package servlet;/**
 * @author 三月水
 * version  0.5
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo66")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("重定向.....");
    }

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

启动web服务器访问demo55,url路径发生了跳转

 输出结果

 小结:

请求重定向多用于网站迁移,一次会话两次请求中不可共享域(Request域)中数据,可以重定向至web工程外的资源。

 请求转发和请求重定向的区别

请求转发:一次会话一次请求中共享域中的数据,浏览器url地址栏不会改变,只能转发服务器内部资源

请求重定向:一次会话二次请求不能共享域中的数据 ,浏览器url地址栏发生改变,可以重定向任意位置的资源(服务器内外部皆可)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_63573177/article/details/124585358

智能推荐

CSS学习总结_css主要学习内容_里象.的博客-程序员秘密

CSS学习总结一、什么是CSS一、什么是CSSCSS全称Cascading Style Sheets,叫做级联样式表,是用来美化之前用html构建的网页的显示内容;如整个页面的布局,元素的位置、距离、颜色、大小、是否显示、是否浮动、透明度等等。...

jsonp 的原理及应用_god_speed丶的博客-程序员秘密

1. 什么是jsonpjsonp全称json with padding,填充式的json,jsonp是为跨域而生的2. 那么有哪些标签可以跨域呢&lt;img src=""&gt; //图片&lt;link href=""&gt; //css&lt;script src=""&gt; //程序我们可以使用script来帮助我们跨域2.1 写一个服务端server.js//服务端//引入支持接受请求,返回响应的模块httpconst http=require("http");//创建

docker ,nginx配置http为https_魅惑青花瓷的博客-程序员秘密

步骤一,将pem文件放在nginx/conf.d中目录二,在conf文件中,添加一下内容(nginx1.5之前的版本是有 ssl on; 的,1.5之后的版本就不需要了,只要在listen 443 后添加ssl即可)server { listen 443 ssl; server_name www.erpmobiletest.xinyartech.com...

MySQL IFNULL() 函数_balangzhan6550的博客-程序员秘密

MySQL函数IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。IFNULL() 函数语法格式为:IFNULL(expression, alt_value)如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。参数说明:参数     ...

open-set recognition(OSR)开集识别的一些思考(三)_herr_kun的博客-程序员秘密

前言:在之前的博客中提到了开集识别的一些方案,主线是基于DNN方式,但是基于ML方式的解决方案有很多是很经典的,所以这里介绍下基于ML的方式基于ML的方式 SVM based (待展开) Sparse Representation based (待展开) Distance based (待展开) Margin Distribution based (待展开)…...

项目中的 @ResponseBody注解详解_歌手爱编程的博客-程序员秘密

我们常常在学习、开发Java程序时,会碰到@ResponseBody 注解,如果不明白这个注解的作用,看下面这个文章希望能帮助到你 !@ResponseBody 注解的作用是将Controller的方法返回的对象,通过转换器转换为指定的格式之后,写入到 Response 对象的 body 区,常用来返回 JSON 数据或XML 数据 。注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 Response 对象输出指定格式的数据 。1. @Resp...

随便推点

oracle 开发 第06章 子查询_dengyuan9283的博客-程序员秘密

2016-01-14子查询 出现在FROM、WHERE、HAVING子句中的SELECT语句。一、单行子查询--对外部SQL不返回结果,或只返回一行。1.WHERE子句(嵌套子查询 inline view)select first_name, last_name from customers where customer_id = (se...

PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例_php 连接sqlsrv 2008_my98800的博客-程序员秘密

本文实例讲述了PHP连接MSSQL2008/2005数据库(SQLSRV)配置方法,分享给大家供大家参考。具体方法如下:PHP连接MSSQL2008/2005数据库与以往的连接mssql2000是不一样的,连接mssql2008/2005是需要自己添加PHP对MSSQL连接的驱动扩展了,而我们常用的hp.ini中的extension=php_mssql.dll扩展只适用连接于MSSQL20

ORB-SLAM2 安装和编译 及BUG解决方案_orbslam2编译_kakelu的博客-程序员秘密

ORB-SLAM2 的安装和编译ORB-SLAM2是一个非常经典的视觉SLAM 开源方案,可以作为你学习SLAM的范本。本文主要介绍如何在LINUX操作系统上,及ubantu上使用视频运行ORB-SLAM2。也列出了本人在安装过程中出现的出现的问题以及解决问题的相应方案。下面是安装及编译的流程,请大家严格遵守安装顺序,不然会出现依赖错误。从github.com下载ORB-SLAM2的代码。地址是:添加链接描述可以在github上直接download ZIP压缩文件。也可在安装git之后,用以下

谈Elasticsearch下分布式存储的数据分布_Mr-Bruce的博客-程序员秘密

本文探讨了Elasticsearch是如何让数据均衡的分布在不同的节点上,主要有三个影响:节点位置、磁盘空间、单个节点的Index和Shard个数。

PHP7中php.ini、php-fpm和www.conf的配置_eastlhu的博客-程序员秘密

原文地址:https://typecodes.com/web/php7configure.html根据前文《CentOS 7.1编译安装PHP7》的configure编译参数设定,安装后的PHP7配置文件所在路径是/usr/local/php7/etc。该目录下会有两个配置文件:php-fpm.conf和php.ini,以及一个文件夹php-fpm.d(包含www.conf文件)。

推荐文章

热门文章

相关标签