JavaWeb学习一Servlet

servlet是什么

  1. Servlet 是javaEE规范之一。规范就是接口
  2. servlet 是javaweb 三大组件之一。三大组件分别是 Servlet程序,Filter过滤器,Listen 监听器。
  3. Servlet 是运行在服务器上的java 程序,它可以接受客户端发送的请求,并响应给客户端。

 

第一个Servlet程序

  1. 编写一个类去实现 Servlet 接口
  2. 实现services方法,处理请求,并响应数据。
  3. 到web.xml 中配置servlet程序的访问地址。

 

手动添加servlet jar包

右键 -> open Module setting

image.png

新建一个类,继承所有方法。

package com.study.servlet;

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

public class HelloServlet implements Servlet {
  void HelloServlet() {
    System.out.println("constructor");
  }

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

  @Override
  public ServletConfig getServletConfig() {
    System.out.println("getServletConfig");
    return null;
  }

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

  @Override
  public String getServletInfo() {
    System.out.println("getServletInfo");
    return null;
  }

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



// 配置 web.xml配置
 <servlet>
    <!--    类名称   -->
    <servlet-name>HelloServlet</servlet-name>
    <!--  类名加配置  -->
    <servlet-class>com.study.servlet.HelloServlet</servlet-class>
  </servlet>

  <!--  路径相关  -->
  <servlet-mapping>
    <!--  类名  -->
    <servlet-name>HelloServlet</servlet-name>
    <!--  路径  -->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

 

然后访问 /hello 可以看到打印输出

image.png

每一次访问都会执行 `services` 方法,但是 `init` 方法只执行一次。

停止时触发destroy

image.png

 

 

使用idea快捷生成servlet

image.png

 

package com.study.servlet;

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;

@WebServlet(name = "Servlet2")
public class Servlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 触发post方法时执行
        System.out.println("doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 触发Get方法时执行
        System.out.println("doGet");
    }
}

 

Servlet获取请求参数

 

request.getParameter("name");

 

Servlet响应内容

PrintWriter out = response.getWriter();
out.println("hello javaweb servlet");

 

servlet-api jar包关联

新建lib 目录,复制servlet-api.jar到lib下面

右键lib,mark to Libray

image.png

 

idea 启动 servlet

  1. 新增启动方式

image.png

  1. 添加项目目录

image.png

image.png

 

注解servlet 代替 web.xml 配置(2.5版本以上)

image.png

常用配置

name  类名称  对应 servlet-class

value  对应servlet-mapping  中的 <url-pattern>

urlPatterns  和value 一样,对应servlet-mapping  中的 <url-pattern>

loadOnStartup  加载顺序

 

@WebServlet(name = "Servlet2",value = {"/servlet2","/servlet3"})
public class Servlet2 extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doPOST");
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doGet");
  }
}

 

Request 和 Response

 

request相关方法    

  • getMethod();     获得请求方式
  • getRequestURL();    返回客户端发出请求时的完整URL。
  • getRequestURI();    返回请求行中的资源名部分。
  • getContextPath();    当前应用的虚拟目录
  • getQueryString() ;    返回请求行中的参数部分。
  • getParameter();  获取参数 GET/POST 通用

 

Response相关方法

  • response.setStatus(302);  // 设置状态码.
  • response.setHeader("location","http://www.baidu.com");// 设置响应头

向客户端输出中文数据

  • 用OutputStream(字节流)发送数据:
    • response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
    • response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认用GB2312)会出现乱码

 

  • 用PrintWriter(字符流)发送数据:
    • 示例:response.getWriter().write(“中国” );有没有乱码?
    • 原因:以默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码

 解决办法:

    setCharacterEncoding(“UTF-8”);

    //更改编码为UTF-8

    response.setHead(“Context-type”,”text/html;charset=UTF-8”);

    //告诉客户端编码方式

  注意:不要忘记告诉客户端的编码方式。

    由于经常改动编码,response提供了一种更简单的方式

    response. setContentType(“text/html;charset=UTF-8”); 其作用相当于以上两条代码。

 

Cookie 和 Response

 

设置cookie

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doGet");
    // 添加cookie
    response.addCookie(new Cookie("papa", "aa"));
    response.addCookie(new Cookie("sid","123"));
    // 响应结果
    response.getOutputStream().write("hello".getBytes());
  }

 

 

获取cookie

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doGet");
    StringBuilder res = new StringBuilder();
    String name = null;
    String val = null;
    // 获取到的cookie是一个 数组
    Cookie[] oldSid = request.getCookies();
    for (int i = 0;i<oldSid.length;i++){
      name = oldSid[i].getName();
      val = oldSid[i].getValue();
      res.append(name + " : "+ val +"\n");
    }
    // 添加cookie
    response.addCookie(new Cookie("papa", "aa"));
    // 添加sid 随机
    response.addCookie(new Cookie("sid",String.valueOf(Math.random())));
    // 响应结果
    response.getOutputStream().write(res.toString().getBytes());
  }

image.png

 

设置session

// 获取一个session,如果不存在,则创建
HttpSession session = request.getSession(true);

//设置新的时间
session.setAttribute("t",System.currentTimeMillis());

获取session

// 获取一个session,如果不存在,则创建
    HttpSession session = request.getSession(true);
    // 获取上次的时间
    Object t = session.getAttribute("t");

 

 

ServletContext  servlet 上下文

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象

 

 

 

Filter 过滤器

 

过滤器是指客户端和请求响应之间的一道过滤技术。

 

package com.study.servlet;

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

// 拦截所有请求
@WebFilter(value = "*")
public class HelloFilter implements Filter {
  public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("init");
  }

  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("doFilter");
    // 如果没有携带auth 属性,则未授权
    String auth = servletRequest.getParameter("auth");
    if (auth == null) {
      System.out.println("未授权");
    }
    // 继续,等价于express 的next;
    filterChain.doFilter(servletRequest, servletResponse);
  }

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

image.png

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值