JavaWeb —— Servlet(看这篇就够了,通俗易懂快速掌握)

前言:

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地址栏发生改变,可以重定向任意位置的资源(服务器内外部皆可)。

  • 18
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sanyueshui_Go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值