Servlet基本知识


Servlet基本知识

1.IDEA创建第一个Servlet程序xing

这里说明如何使用 IDEA Ultimate 2020.1.3版本来新建第一个web程序。参考 MoonChasing

1.1 已安装软件

  • JDK1.8
  • IDEA Ultimate 2020.1.3
  • Tomacat 9

1.2 步骤

File → New →Project→ Java Enterprise,

确保:

  • Project SDK是正确的 JDK1.8
  • Java EE 8
  • Application Server 选择 Tomcat正确安装目录

勾选 Web Application,Next就好了。

  1. 之后在 WEB-INF中新建classes,lib目录分别放字节码文件和依赖jar包并对应的进行设置,File→Project Structure→Modules→path 在 Compiler output 中选择 Use module compile output paht 将两个 path 都设置为 WEB-INF中的 classes目录,勾选 Exclude output paths ,然后再 dependency 中 + jar Directory 设置为 刚刚新建的lib目录 最后 apply & OK

  2. 然后再 Run → Edit Configuration 界面会自动出现Tomcat Server,确认 Application server,URL,HTTP port 8080 是否正常,一般不需要修改,

    BTW:URL是 http://localhost:8080/项目名_war-exploded/ apply & OK

最后可以点击 右上方的绿色三角形开始运行,在运行之前,确保 Tomcat没有自启动,否则会启动失败并报端口已被占用的Error信息,运行后一般浏览器跳到 上述 URL,内容是 index.jsp。同时可能会存在 IDEA中的输出日志信息中文乱码,可以参考 方法解决

1.3 第一个 Servlet程序

  1. 在src目录下新建 FirstServlet.java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受请求发来的参数
        String name = req.getParameter("name");
        String html = "

hi," + name + "!


"; System.out.println("返回给浏览器的相应数据为: " + html); PrintWriter out = resp.getWriter(); out.println(html);//将html发送回浏览器 } }
  1. 在web.xml 的 内 添加如下内容
FirstServlet
    
        index.html
        index.jsp
        default.html
        default.jsp
    

    
        first
        FirstServlet
    

    
        first
        /hi
    

然后右击编辑器左下角的Tomcat 9.0.41[local],并且运行,浏览器自动启动,在地址栏 http://localhost:8080/WebDemo2_war_exploded/,后面添加 hi/?name=jack,就跳出 hi,jack的页面,即为动态响应页面

http://IP地址:端口/context-path/url-mapping

context-path就是项目名

2.标准Java-web工程结构

3.获取请求参数

getParameter() 获取request的单个参数值

getParameterValues() 获取参数列表

SampleServlet.java

public class SampleServlet extends HttpServlet {
    //service是请求处理的核心方法,无论是get或者post都会被service()方法处理
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String method = request.getMethod();
        String name = request.getParameter("name");
        String mobile = request.getParameter("mobile");
        String[] specs = request.getParameterValues("spec");
        PrintWriter out = response.getWriter();
        out.println("

Method:" + method + "

"); out.println("

Name:" + name + "

"); out.println("

mobile:" + mobile + "

"); for(String spec:specs) { out.println("

spec:" + spec + "

"); } out.println("baidu"); } }

student.html




    
    Title


学员信息登记表

姓名:
电话:
性别:
特长: 英语 编程 演讲 游泳

web.xml 添加:


        sample
        com.imooc.servlet.SampleServlet


        sample
        /sample

两种请求

get请求:

将数据通过URL附加数据显性向服务器发送数据,用?分割参数和URL,如下:

http://localhost:8080/SevletDemo1_war_exploded/sample?name=sbt&mobile=123&sex=male&spec=English&spec=Program

post请求

将数据存放在"请求体"中隐形发送数据

在HttpServlet中对应有doGet() 和 doPost() 方法

4.Servlet生命周期

装载-web.xml → 创建-构造函数 → 初始化 - init() → 提供服务- service() → 终止 destroy() ,在这里 init 对应的是 ServeltContext对象

FirstServlet.java

package com.imooc.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {
    // 创建-调用构造函数
    public FirstServlet(){
        // System.out.println()是输出结果到控制台 
        System.out.println("正在创建FirstServlet对象");
    }
    // 初始化-调用init()方法
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("正在初始化FirstServlet对象");
    }
    // 提供服务-service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受请求发来的参数
        String name = req.getParameter("name");
        String html = "

hi," + name + "!


"; System.out.println("返回给浏览器的相应数据为: " + html); PrintWriter out = resp.getWriter(); out.println(html);//将html发送回浏览器 } @Override // 销毁 public void destroy() { System.out.println("终止Servlet对象"); } }

BTW:IDEA中快捷键 Control+O 可以展开类的所有可重写的方法

5.注解简化配置

Servlet 3.x引入 “注解Annotation”特性,用于简化Web应用程序的配置过程,避免了在java与xml中的频繁切换的烦恼,核心注解是:@WebServlet,直接在java文件中添加 URL映射信息

@WebServlet("/anno")
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("I'm annotation servlet!");
    }
}

BTW:如果在jsp页面中 form表达中 action="" 链接必须要在注解的 url 前加上项目名(也称contextpath),但是在IDEA中,由于会默认添加 "_war_exploded" 因此 action="/项目名_var_exploeded/anno",这个需要注意。

6.设置初始化加载顺序

web.xml使用设置启动加载顺序

0~9999

启动时加载在工作中常用于系统的预处理

具体操作是

1.init()

这里分别写入三个类

public class CreateServlet extends HttpServlet { 
    // 在init中写入具体操作
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("正在创建数据库");
    }
}
public class ImportServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("准备导入数据");
    }
}
public class AnalysisServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("开始分析数据");
    }
}

在web.xml中 中加 0~2,0表示最先加载,依次递减,这里无需 urlpattern绑定,因为这是预加载,并没有post,get请求相关

    
        create
        CreateServlet
        0
    

    
        import
        ImportServlet
        1
    

    
        analysis
        AnalysisServlet
        2
    

结合注解,格式如下,以 AnalysisServlet为例:

@WebServlet(urlPatterns="/unused",loadOnStartup=2) //这里 url可以任意,但是不要重,不会被用到
public class AnalysisServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("开始分析数据");
    }
}