Servlet

JSP本身就是Servlet,只是Servlet的不同表现形式。

背景知识

常用的Web服务器

  • IIS Microsoft专用
  • Apache C语言编写
  • Tomcat Java语言编写

通常的动态网页技术

  • CGI(Common GateWay Interface)
  • API常用的有NSAPI、ISAPI
  • ASP(Active Server Page) 以进程方式运行,效率较低,现在演化为ASP.net。
  • PHP(Personal Home Page)
  • JSP/Servlet(Java Server Page) 以线程方式运行

Servlet简介

  • 服务器小应用程序(Server let)
  • 完成B/S架构下客户端请求的响应处理
  • 平台独立性能良好,以线程方式运行
  • Servlet API为Servlet提供了统一的编程接口
  • Servlet在容器中运行
  • 常见Servlet容器Tomcat

Tomcat 初步

Tomcat是一个WebServer,是JSP的容器,是Servlet的容器。

cd D:/tomcat/bin

# windows下查看tomcat版本
version

# windows下启动关闭tomcat
startup
shudown

# windows以catalina方式启动关闭tomcat
catalina startup
catalina shudown

# 以catalina的debug模式启动
catalina debug
run  

# 访问 http://127.0.0.1:8080

若tomcat启动失败,需要检查下

  • JAVA_HOME环境变量配置
  • 系统防火墙端口设置
  • 查看启动日志
  • 以catalina的debug模式启动
  • 检查默认端口是否被占用

Tomcat目录结构

tomcat 5.5.14

  • bin 二进制可执行文件和脚本
  • common Catalina本身和web应用可加载的类目录
  • conf 配置文件目录
  • logs 日志目录
  • server 服务器所需类库目录
  • shared WebApp共享的类库
  • webapps Web应用所存放的目录applications
  • work Tomcat工作目录,存放jsp产生的class文件
  • temp 临时文件目录

Tomcat配置文件

  • conf/server.xml 服务器主配置文件
  • conf/web.xml web应用配置,缺省的Servlet定义和MIME类型定义
  • conf/tomcat-users.xml Tomcat用户信息

Tomcat 管理页面设置管理员和密码

Tomcat8定义4中角色

  • manager-gui
  • manager-script
  • manager-jmx
  • manager-ststus
# conf/tomcat-users.xml





访问

http://127.0.0.1:8080/manager/status
账户/密码:admin/admin

http://127.0.0.1:8080/manager/html
账户/密码:admin/admin

IDE:Interllij IDEA 2017.2.6

创建Servlet

# 创建包
com.test.servlet

# 创建Servlet文件
src/com/test/serlvet/Servlet.java

package com.test.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;
import java.io.PrintWriter;

@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("do get success");
    }
}

# web.xml添加配置


    
        Servlet
        com.test.servlet.Servlet
    
    
        Servlet
        /test
    


# 访问路由
http://127.0.0.1/test/test

HTTP协议基础

GET请求

GET /latest.html HTTP/1.1
Host: http://127.0.0.1
Content-Type: text/html

...

POST 请求

POST /servlet/serv HTTP/1.1
Host: http://127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
username=alice&password=alice

响应信息

HTTP/1.1 200 OK
Date: Fri,31 Dec 2017 12:30:32 GMT
Content-Type: text/html
Content-length: 280

测试

package com.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class Test {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("127.0.0.1", 8888);
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        pw.println("GET / HTTP/1.1");
        pw.println("Host: http://127.0.0.1/test");
        pw.println("Content-Type: text/html");
        pw.println();
        pw.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str = "";
        while((str = br.readLine()) != null){
            System.out.println(str);
        }

        br.close();
        pw.close();
        socket.close();
    }
}

Web Application的概念

  • WebApplicationName
    • WEB-INF
      • web.xml WebApp的配置文件
      • lib WebApp库文件
      • classes 存放编译后的servlet
    • META-INF 存放WebApp上下文信息,符合J2EE标准。

Web Application可直接放在webapps目录下, 也可通过配置文件指定到其他目录。

# tomcat/conf/server.xml


Servlet

查看手册 https://docs.oracle.com/javaee/7/api/toc.htm

项目引入tomcat/lib/servlet-api.jar

创建 UserServlet

# src/com/test/servlet/UserServlet.java
package com.test.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 = "UserServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("success");//在后台打印数据
        //获取GET参数

        //向客户端写入数据
        response.getWriter().write("ok");
    }
}

配置 web.xml

# web/WEB-INF/web.xml


    
        UserServlet
        com.test.servlet.UserServlet
    
    
        UserServlet
        /user
    

编辑前台 index.jsp

# web/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    homepage
    


    


访问 http://127.0.0.1/test/user

Servlet生命周期

# src/com/test/servlet/UserServlet.java

package com.test.servlet;

import javax.servlet.ServletConfig;
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 = "UserServlet")
public class UserServlet extends HttpServlet {
    /*构造方法*/
    public UserServlet(){
        System.out.println("constructor");
    }

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

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

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

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");//在服务端控制台打印输出数据
        //向客户端写入数据
        response.getWriter().write("ok");
    }
}

Servlet声明周期中只存在一个对象提供服务

  • 第一次访问http://127.0.0.1:8080/test/user,执行输出 constructor => init => doGet

  • 第二次访问http://127.0.0.1:8080/test/user,执行输出 doGet

只有当tomcat进行shutdown时会执行destroy(),可通过catalina debug启动tomcat查看。在整个Web Application退出的时候,Servlet的destroy()会被调用。

Servlet生命周期

  • 加载 classLoader加载类文件
  • 实例化 constructor new对象实例化时
  • 初始化 init()仅执行一次,即第一次初始化时执行。
  • 处理请求 doGet() / doPost()
  • 退出服务 destroy() Web Application退出是被调用

Servlet编程接口

  • GenericServlet是所有Servlet的鼻祖
  • 用于HTTP的Servlet编程都通过继承javax.servlet.http.HttpServlet实现
  • 请求处理方法,分别对应HTTP协议的7中请求
    • doGet() 响应GET请求
    • doPost() 响应POST请求
    • doPut() 用于HTTP协议的1.1版本
    • doDelete() 用于HTTP协议的1.1版本
    • doHead() 仅响应GET请求的头部
    • doOptions() 用于HTTP协议的1.1版本
    • doTrace() 用于HTTP协议的1.1版本
  • 在非分布式的环境下,通常仅有一个Servlet在服务器中,即仅存在一个实例对象。

处理请求

访问地址 http://127.0.0.1:8080/test/user

# web/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    
    homepage
    


    

添加用户

# src/com/test/servlet/UserServlet.java
package com.test.servlet;

import javax.servlet.ServletConfig;
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;
import java.io.PrintWriter;

@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取客户端提交数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //向客户端写入数据
        PrintWriter pw = response.getWriter();
        response.setContentType("text/html");//设置响应的编码格式
        pw.println(username);
        pw.println(password);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
# web/WEB-INF/web.xml


    
        UserServlet
        com.test.servlet.UserServlet
    
    
        UserServlet
        /user
    

获取请求的所有参数

# web/product.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    
    Title
    


添加商品

具有两个相同的name为quantity的单行文本框

# src/com/test/servlet/ProductServlet.java
package com.test.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;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet(name = "ProductServlet")
public class ProductServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String value = "";
        Enumeration names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = (String)names.nextElement();
            String[] values = request.getParameterValues(name);
            if(values.length==1){
                value = values[0];
            }else{
                for(int i=0; i
  • getParameterNames()
  • getParameterValues()
  • hasMoreElements()
  • nextElement()
# web/WEB-INF/web.xml


    
        ProductServlet
        com.test.servlet.ProductServlet
    
    
        ProductServlet
        /product
    

访问 http://127.0.0.1:8080/test/product.jsp

处理COOKIE

  • HTTP协议无连接性(短连接)要求出现一种保存C/S间状态的机制
  • Cookie保存客户端的一个文本文件与特定客户端相关
  • Cookie以"键值对"(名值对)形式存放数据,非常类似Map。
  • 创建Cookie new Cookie(name,value)
  • 设置获取Cookie
    • setName(String name) / getName()
    • setValue(String value) / getValue()
    • setMaxAge(int age) / getMaxAge()
  • 使用HttpServletResponseaddCookie(Cookie)将Cookie设置到客户端
  • 使用HttpServletRequestgetCookie()读取客户端所有Cookie,返回Cookie数组。

问题分析

  • 服务端可向客户端写内容,仅能是文本内容。
  • 客户端可组织服务端写入
  • 服务端仅能获取到自己web application写入的内容

Chrome中Cookie文件位置
C:\Users\jc\AppData\Local\Google\Chrome\User Data\Default\Cookies

你可能感兴趣的:(Servlet)