Servlet开发JavaWeb工程示例详解

一、什么是Servlet?

Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行。也有创建、垃圾回收和销毁过程。Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;
  • 处理请求;
  • 完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理。Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。Servlet对象驻留在服务器内存中。

1、编写一个Servlet程序

写一个java类,实现Servlet接口,实现了该接口,该类就不是普通的类了。

package servletdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {

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

  }

  @Override
  public ServletConfig getServletConfig() {
    return null;
  }

  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

  }

  @Override
  public String getServletInfo() {
    return null;
  }

  @Override
  public void destroy() {

  }
}

部署应用到tomcat服务器。

测试:http://localhost:8080/MyMavenHome_war/servlet 在IDEA控制台输出 hello servlet,初体验成功!

二、Servlet的生命周期

实例化-->初始化-->服务->销毁

      出生:(实例化-->初始化)第一次访问Servlet就出生了(默认情况下)。(说明我可以改变它的出生时机,比如让servlet在服务器启动时就创建)

      活着:(服务)应用活着,servlet就活着。(Servlet是单实例,其中的service()方法是多线程的。)

      死亡:(销毁)应用被卸载了,servlet就销毁了。

package servletdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {

  //Servlet生命周期的方法:实例化方法(new 对象,无参构造)
  //在servlet第一次被访问时调用
  public servletDemo() {
    System.out.println("*******servletDemo执行了");
  }

  //Servlet生命周期的方法:初始化方法
  //在servlet第一次被访问时调用
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("*********init执行了");

  }

  @Override
  public ServletConfig getServletConfig() {
    return null;
  }

  //Servlet生命周期的方法:服务方法
  //每次访问时都会被调用
  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("*******service执行了");
  }

  @Override
  public String getServletInfo() {
    return null;
  }

  //Servlet生命周期的方法:销毁方法
  //当应用被卸载时调用
  @Override
  public void destroy() {
    System.out.println("*******destroy执行了");
  }
}

 

三、实现Servlet的方式

实现Servlet有三种方式:

  • 实现javax.servlet.Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;

自定义Servlet类的继承结构,如下图:

1、实现javax.servlet.Servlet接口(参见:编写一个servlet程序) 

2、继承javax.servlet.GenericServlet类(抽象类)(适配器模式)    

GenericServlet类(抽象类)已经实现了Servlet接口,我们用哪个方法就调用哪方法,不用再去全部实现了,哪怕是全部的空实现。

3、继承javax.servlet.http.HttpServlet类(抽象类)(模板方法设计模式)    

模板是HttpServlet类中的私有service()方法(开发中常用方式)    

HttpServlet类(抽象类)继承了GenericServlet类(抽象类)

package servletdemo;

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("/servlet1")
public class servlet extends HttpServlet {
  //具体实现1
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("******MydoGet*******");
    System.out.println(req.getRemoteAddr());
  }

  //具体实现2
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("*******MydoPost******");
  }

}

注意:不要重写父类Httpservlet中的service()方法,因为该方法会调用Httpservlet中私有的service()方法,

   而该私有的service()方法会根据不同的提交表单的方式,会调用相应的doGet()、doPost()、doHead()等方法。

    我们去重写这些不同的表单提交的方法即可。

      Servlet(接口) -->GenericServlet(抽象类/适配器) -->HttpServlet(功能抽象类/模板)-->(继承HttpServlet,具体实现类,重写其功能)

4、公牛表白的故事

此故事纯属本人脑洞虚构

故事内容:草原上有一头公牛喜欢一头母牛,但是公牛不敢直接向母牛表白,有一天公牛找到一头小牛,想让小牛把他想对母牛说的话说给母牛听,小牛答应了,剧情很鸡血,就这样,看我用servlet实现

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>公牛表白准备</h2>
<a href="/servlet2" rel="external nofollow" >去表白</a>
</body>
</html>

package com.demo.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet2")
public class ServletDemo2 extends GenericServlet {
  @Override
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    System.out.println("我是草原上的公牛");
    System.out.println("我让小牛把我对母牛的爱传给她");
    System.out.println("该说的话我给小牛说了,小牛听到了给我回复收到,并把我说的话传给母牛");
    ServletContext application = this.getServletContext();
    application.setAttribute("name","母牛");
    application.getRequestDispatcher("/servlet3").forward(req,res);

  }
}

package com.demo.servlet;

import javax.servlet.ServletContext;
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("/servlet3")
public class ServletDemo3 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    doPost(req,resp);
    System.out.println("我是小牛");
    //设置输出格式和字符编码
    resp.setContentType("text/html;charset=utf-8");
    //向页面输出内容
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是小牛</h1>");
    ServletContext application = this.getServletContext();
    String name = (String) application.getAttribute("name");
    System.out.println("收到的名字:"+name);
    out.println("收到的名字:"+name);
    System.out.println("小牛收到");
    application.setAttribute("love","公牛说他爱你");
    application.getRequestDispatcher("/servlet4").forward(req,resp);

  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    System.out.println("我是dopost");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是servlet33</h1>");
  }

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.service(req, resp);
    System.out.println("我是service333");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<h1>我是servlet333</h1>");
  }
}

 

package com.demo.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("/servlet4")
public class Servlet4 extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req,resp);
    System.out.println("我是母牛");
    String love = (String) this.getServletContext().getAttribute("love");
    System.out.println(love);
    resp.setContentType("text/html;charset=utf-8");
    //向页面输出内容
    PrintWriter out = resp.getWriter();
    out.println("收到的表白:"+love);
    System.out.println("母牛收到");
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  }
}

5、servlet的映射细节    

 1、servlet的映射细节一:

一个servlet可以配置多个映射路径(或者说:多个映射路径可以指向同一个servlet),只要是name是一样的就行

2、servlet的映射细节二:

 通配符*代表任意字符串

url-pattern:*.xxx 以.xxx结尾的请求都可以访问 注:不要加/

url-pattern:/* 以任意字符串结尾的请求都可以访问

url-pattern:/xxxx/*以/xxxx/开头的请求都可以访问

6、对servlet配置有两种方法

1、在web.xml中对servlet进行配置

2、利用注解进行配置

在servlet类的上面写入注解@WebServlet("/hello")

7、实例一——在web.xml中配置

1、在Web.xml中配置路径和参数

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <servlet>
  <servlet-name>Servletdemo1</servlet-name>
  <servlet-class>com.demo.servlet.Servletdemo1</servlet-class>
  <init-param>
   <param-name>name</param-name>
   <param-value>tom</param-value>
  </init-param>
  <init-param>
   <param-name>password</param-name>
   <param-value>1234</param-value>
  </init-param>

 </servlet>
 <servlet-mapping>
  <servlet-name>Servletdemo1</servlet-name>
  <url-pattern>/servlet</url-pattern>
 </servlet-mapping>

 <context-param>
  <param-name>k</param-name>
  <param-value>xxxxxxxx</param-value>
 </context-param>
</web-app>

2、在servlet中获取参数和值

package com.demo.servlet;

import javax.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class Servletdemo1 implements Servlet {
  private ServletConfig servletConfig;

  @Override
  public void init(ServletConfig config) throws ServletException {
    servletConfig=config;
    System.out.println("init调用了");

  }

  @Override
  public ServletConfig getServletConfig() {
    return servletConfig;
  }

  @Override
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    //设置输出格式和字符编码
    res.setContentType("text/html;charset=utf-8");
    //向页面输出内容
    PrintWriter out = res.getWriter();
    out.println("我是service"+"<br>");
    System.out.println("我是service");

    //方法一
    String name = servletConfig.getInitParameter("name");
    String password = servletConfig.getInitParameter("password");

    System.out.println("在控制台输出信息:");
    System.out.println("name:"+name+"password:"+password);

    out.println("name:"+name+" "+"password:"+password+"<br>");

    //方法二
    Enumeration<String> en = servletConfig.getInitParameterNames();
    while (en.hasMoreElements()){
      String names = en.nextElement();
      String values = servletConfig.getInitParameter(names);

      System.out.println("在控制台输出信息:");
      System.out.println(names+" "+values);
      out.println(names+" "+values+"<br>");
    }

    String k = servletConfig.getServletContext().getInitParameter("k");
    System.out.println("在控制台输出信息:");
    System.out.println("k:"+k+"<br>");
    out.println("k"+k);
  }

  @Override
  public String getServletInfo() {
    return null;
  }

  @Override
  public void destroy() {

  }
}

8、实例二——利用注解配置

package com.demo.servlet;

import javax.servlet.ServletContext;
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("/hello")
public class Servlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req,resp);
    ServletContext servletContext = this.getServletContext();
    servletContext.setAttribute("user","Tom");
    String user = (String)servletContext.getAttribute("user");

    //从请求的地址栏或表单中获取信息
    String user2 = req.getParameter("user");

    System.out.println("获取Context容器中的信息:"+user);
    System.out.println("在控制台输出从访问的地址栏获取的信息:"+user2);
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");

    PrintWriter out = resp.getWriter();
    out.append("<!DOCTYPE html>")
        .append("<html><head></head><body>")
        .append("用户是"+user)
        .append("</body></html>");

  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  }
}
 

四、Servlet的线程安全

    整个生命周期是单实例,但每次访问时为多线程。

      一:单实例变成多实例,但过时了,因为耗费资源多,服务器压力大。

      二:加线程锁,但数据会重复出现(没有同步机制),且运行效率低。

      三:解决线程安全问题的最佳办法:不要写全局变量,而写局部变量(即改变变量的作用域)。

五、ServletContext对象(重要)

    ServletContext:代表的是整个应用。一个应用只有一个ServletContext对象。单实例。

一个项目只有一个ServletContext对象,服务器会为每个应用创建一个ServletContext对象,我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据,与Tomcat同生同死。

  • ServletContext对象的创建是在服务器启动时完成的
  • ServletContext对象的销毁是在服务器关闭时完成的。

ServletContext对象的作用是在整个Web应用的动态资源直接共享数据。例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是数据共享。

1、获取ServletContext

在Servlet中获取ServletContext对象:

在void init(ServletConfig config)中:

ServletContext context = config.getServletContext();

public class DemoServlet implements Servlet {

  public void init(ServletConfig config) throws ServletException {

    ServletContext context = config.getServletContext();

  }

}

GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()类获取。在GenericServlet或HttpServlet中获取ServletContext对象:

public class HttpServletDemo extends HttpServlet {

  @Override

  protected void doPost(HttpServletRequest req, HttpServletResponse resp)

      throws ServletException, IOException {

    ServletContext context = this.getServletContext();

  }

}

 

HttpSession中也可以通过getServletContext()方法来获得

2、域对象的功能

ServletContext是JavaWeb四大域对象之一:

  • PageContext
  • ServletRequest
  • HttpSession
  • ServletContext

所有域对象都是有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:

void setAttribute(String name,Object val):用来存储一个对象,也可以成为存储一个域,参数分别为域的属性名和属性值,如果多次调用该方法,并且使用相同的name,那么就会覆盖上一次的值,这一特性与Map相似。Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先存储。void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name不存在,那么该方法什么都不做。Enumeration getAttributeNames():获取所有域属性的名称。

2.获取全局配置信息:

 方法:public String getInitParamenter(String name)// 根据配置文件中的key得到value

3、读取简单的资源文件(即只包含key=value的形式):

  方法:public StringgetRealPath(Stringpath)//根据资源名称得到资源的绝对路径,可以得到当前应用任何位置的任何资源。

public class AServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    //获取带有盘符的路径
    String path = this.getServletContext().getRealPath("/a.txt");

    //获取资源路径后,再获取输入流对象
    InputStream is = this.getServletContext().getResourceAsStream("/a.txt");

    //获取当前路径下的所有资源路径
    Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");

  }
}

4、Servlet的转发与重定向

转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。

1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获得,一种是通过ServletContext的getRequestDispatcher()方法获得;

以前的request范围中存放的变量不会失效,就像把两个页面拼到了一起。 例如:

request.getRequestDispatcher (“demo.jsp"). forward(request, response);//转发到demo.jsp

详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用forward()方法,将请求转发给servlet2。但是调用forward()方法,对于浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2,它只知道发出了一个请求,获得了一个响应。浏览器URL的地址栏不变。

2、重定向:HttpServletResponse的sendRedirect()方法。

服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享request范围内的数据。例如:response.sendRedirect(“demo.jsp");//重定向到demo.jsp

详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用sendRedirect()方法,将客户端的请求重新定向到Servlet2。接着浏览器访问servlet2,servlet2对客户端请求作出反应。浏览器URL的地址栏改变。

3、主要区别:

(1)sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward()方法只能将请求转发给同一Web应用的组件。

(2)sendRedirect()方法不能转发到“/WEB-INF/”路径下的jsp页面资源,而getRequestDispatcher().forword()可以重定向到“/WEB-INF/”路径下的jsp页面资源。如request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

(3)转发:浏览器URL的地址栏不变。

重定向:浏览器URL的地址栏改变。

5、实现Servlet的请求转发:

    方法:public RequestDispatchergetRequestDispatcher(String path)//参数表示要跳转到哪去

6、依赖和关联

  如果是通过参数传过来的对象,就叫依赖。

  通过方法得到的对象,就叫关联。

六、HTTP请求与响应

1、HTTP请求常用方法

Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

Enumeration getAttributeNames()
返回一个枚举,包含提供给该请求可用的属性名称。

HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。

HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。

String getRequestedSessionId()
返回由客户端指定的 session 会话 ID。

Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。

String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。

String getContentType()
返回请求主体的 MIME 类型,如果不知道类型则返回 null。

String getContextPath()
返回指示请求上下文的请求 URI 部分。

String getQueryString()
返回包含在路径后的请求 URL 中的查询字符串。

String getRemoteUser()
如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。

int getParameterMap()
将参数封装成 Map 类型。

2、设置HTTP响应头的方法

void reset()
清除缓冲区中存在的任何数据,包括状态码和头。

void resetBuffer()
清除响应中基础缓冲区的内容,不清除状态码和头。

void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。

void setStatus(int sc)
为该响应设置状态码。

void setIntHeader(String name, int value)
设置一个带有给定的名称和整数值的响应报头。

HTTP Header 响应实例:

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Refresh")
//扩展 HttpServlet 类
public class Refresh extends HttpServlet {
  // 处理 GET 方法请求的方法
   public void doGet(HttpServletRequest request,
            HttpServletResponse response)
        throws ServletException, IOException
   {
     // 设置刷新自动加载时间为 5 秒
     response.setIntHeader("Refresh", 5);
     // 设置响应内容类型
     response.setContentType("text/html;charset=UTF-8");

     //使用默认时区和语言环境获得一个日历
     Calendar cale = Calendar.getInstance();
     //将Calendar类型转换成Date类型
     Date tasktime=cale.getTime();
     //设置日期输出的格式
     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     //格式化输出
     String nowTime = df.format(tasktime);
     PrintWriter out = response.getWriter();
     String title = "自动刷新 Header 设置 - 菜鸟教程实例";
     String docType =
     "<!DOCTYPE html>\n";
     out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n"+
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + title + "</h1>\n" +
      "<p>当前时间是:" + nowTime + "</p>\n");
   }
   // 处理 POST 方法请求的方法
   public void doPost(HttpServletRequest request,
             HttpServletResponse response)
     throws ServletException, IOException {
     doGet(request, response);
   }
}

  以上测试实例是位于 TomcatTest 项目下,对应的 web.xml 配置为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 <servlet>
   <!-- 类名 -->
  <servlet-name>Refresh</servlet-name>
  <!-- 所在的包 -->
  <servlet-class>com.runoob.test.Refresh</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>Refresh</servlet-name> 同上面的类名
  <!-- 访问的网址 -->
  <url-pattern>/TomcatTest/Refresh</url-pattern>
  </servlet-mapping>
</web-app>

现在,调用上面的 Servlet,每隔 5 秒会显示当前系统时间。

3、HTTP状态码

404:服务器无法找到所请求的页面。

403:禁止访问所请求的页面。

401:所请求的页面需要用户名和密码。

405:在请求中指定的方法是不允许的。

307:所请求的页面已经临时转移到一个新的 URL。

500:未完成的请求。服务器遇到了一个意外的情况。

  下面的方法可用于在 Servlet 程序中设置 HTTP 状态码。这些方法通过HttpServletResponse对象可用。

public void setStatus ( int statusCode )
该方法设置一个任意的状态码。setStatus 方法接受一个 int(状态码)作为参数。如果您的反应包含了一个特殊的状态码和文档,请确保在使用PrintWriter实际返回任何内容之前调用 setStatus。

public void sendError(int code, String message)
该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息。

// 设置错误代码和原因
response.sendError(407, "Need authentication!!!" );

4、Servlet接口&访问方式介绍

  Servlet是实现了javax.servlet.Servlet接口的类,这个接口规定了特定的方法来处理特定的请求,我们只需要实现Servlet相关的方法,Servlet规范是建立在HTTP协议上的,http1.1规范支持OPTIONS/GET/POST/HEAD/PUT/DELETE/TRACE等7种访问方式。下面我们重点介绍Get/Post。

1、GET:表示查询信息,URL中附带少量参数信息,URL总长度不超过255个字符,参数还会在浏览器的地址栏中显示

2、POST:表示提交信息,一般用于提交大数据信息或者文件,提交的内容不收长度限制,也不会在地址栏中显示。

3、HEAD:表示查询文档头信息,服务器返回的文件类型,长度,最后修改时间等等,该方式较少使用。

4、OPTIONS /PUT /DELETE /TRACE:是被声明了但还没有被使用web访问方式,几乎不用。

到此这篇关于Servlet开发JavaWeb工程示例详解的文章就介绍到这了,更多相关Servlet开发JavaWeb内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • javaWeb使用servlet搭建服务器入门

    百度百科说法: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 通俗讲法: 是运行在服务器端的一小段Java程序,接受和响应从客户端发送的请求 作用: 处理客户端请求,并且对请求做出响应 编写一个serclet步骤 1.编写一个类 继承自HttpServlet 重写doGet和doPost方法 2.编写配置文件(web.xml) 先注册后绑定 3.访问

  • JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JS

  • javaweb servlet中使用请求转发乱码的实现

    乱码的方式有很多,这里指出一种不容易想到的 *请确保您的页面单独访问正常,经过servlet请求转发时,有PrintWriter out = response.getWriter()不正常,没有正常 解决方式是在执行PrintWriter out = response.getWriter();前加上 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8&

  • javaweb Servlet开发总结(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</servl

  • JavaWeb组件Servlet使用实例解析

    在JavaWeb中有三大组件,分别是Servlet.Filter和Listener.其中Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,即接收请求数据.处理请求和完成响应. 1. 实现Servlet的方式 主要有三种实现方式:1)实现javax.servlet.Servlet接口:2)继承javax.servlet.GenericServlet类:3)继承javax.servlet.http.HttpServlet类:其中最常用的继承HttpServlet类来实现

  • JavaWeb servlet实现下载与上传功能的方法详解

    本文实例讲述了JavaWeb servlet实现下载与上传功能的方法.分享给大家供大家参考,具体如下: 本文内容: servlet实现下载功能 servlet实现上传功能 首发日期:2018-07-21 servlet实现下载功能 实现流程 1.首先制作一个jsp页面,主要是用来触发下载的.这里可以根据你的想法来做,当然servlet那边就要相应的更改了.我这里使用一个简单的a标签来触发. 2.设置响应信息,告诉浏览器要将传过来的数据识别成下载:根据提交上来的数据找到对应文件,转成流,返回给浏览

  • JavaWeb编程 Servlet的基本配置

    学习JavaWeb的人没有不知道Servlet的吧,而要用Servlet就需要在web.xml中进行配置.相信有很多初学者跟我当初一样,对于一些配置参数不是很理解.下面是一个最基本的Servlet配置: 复制代码 代码如下: <servlet>      <servlet-name>MyServlet</servlet-name>      <servlet-class>com.Servlet.MyServlet</servlet-class> 

  • javaweb中ajax请求后台servlet(实例)

    废话不多说,直接上代码 public class DZFP_jdbc extends HttpServlet{ private static final long serialVersionUID = 1L; public static Connection conn; public static ResultSet rs = null ; public static PreparedStatement ps = null ; private static String url = "jdbc:

  • javaweb Servlet开发总结(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现servlet接口. 2.把开发好的Java类部署到web服务器中. 按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet 二.Servlet的运行过程 Servlet程序是由WEB

  • Servlet开发JavaWeb工程示例详解

    一.什么是Servlet? Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行.也有创建.垃圾回收和销毁过程.Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener),它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: 接收请求数据: 处理请求: 完成响应. 例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完

  • Spi机制在Android开发的应用示例详解

    目录 Spi机制介绍 举个例子 ServiceLoader.load 在Android中的应用 总结 Spi机制介绍 SPI 全称是 Service Provider Interface,是一种将服务接口与服务实现分离以达到解耦.可以提升程序可扩展性的机制.嘿嘿,看到这个概念很多人肯定是一头雾水了,没事,我们直接就可以简单理解为是一种反射机制,即我们不需要知道具体的实现方,只要定义好接口,我们就能够在运行时找到一个实现接口的类,我们具体看一下官方定义. 举个例子 加入我是一个库设计者,我希望把一

  • 基于gin的golang web开发:路由示例详解

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的命令安装Gin go get -u github.com/gin-gonic/gin 在代码里添加依赖 import "github.com/gin-gonic/gin" 快速启动一个Gin服务器的代码如下 package main import "github.com/gin-

  • Android车载多媒体开发MediaSession框架示例详解

    目录 一.多媒体应用架构 1.1 音视频传统应用架构 1.2 MediaSession 框架 媒体会话 媒体控制器 二.MediaSession 2.1 概述 2.2 MediaBrowser 2.2.1 MediaBrowser.ConnectionCallback 2.2.2 MediaBrowser.ItemCallback 2.2.3 MediaBrowser.MediaItem 2.2.4 MediaBrowser.SubscriptionCallback 2.3 MediaContr

  • Vue3搭建组件库开发环境的示例详解

    目录 1 packages 目录 1.1 foo 目录 1.2 yyg-demo-ui 目录 2 实现 foo 示例组件 2.1 初始化 package.json 2.2 初始化 foo 目录结构 2.3 定义 foo 组件的 props 2.4 实现 foo 组件 2.5 定义 foo 组件入口文件 3 实现 yyg-demo-ui 3.1 初始化 package.json 3.2 安装依赖 3.3 定义入口文件 前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库.

  • java中Servlet监听器的工作原理及示例详解

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 2.提供监听器 3.为事件源注册监听器 4.操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法 监听器典型案例:监听window窗口的事件监听器 例如:swing开发首先制造Frame**窗体**,窗体本身也是一个显示空间,对窗体提供监听器,监听窗体方法调用或者属性改变:

  • SSM框架整合JSP中集成easyui前端ui项目开发示例详解

    目录 前言 EasyUI下载与配置 页面美化 运行结果 总结与问题 前言 前端的UI框架很多,如bootsrap.layui.easyui等,这些框架提供了大量控件供开发人员使用,我们无需花费太大的精力,使得我们的页面具有专业标准,使用起来也很简单.所有的前端框架使用方式基本上大同小异,以下使用easyui作为UI框架做一演示,个人认为easyui提供的控件比较好看. EasyUI下载与配置 使用EasyUI,必须下载其js包,下载官网地址:https://www.jeasyui.cn/ 下载j

  • JavaWeb实现表单提交的示例详解

    目录 register.html RegisterServlet.java 修改web.xml,添加如下code 重新配置服务器 先点击左侧图标 再点击Redeploy,重新部署Tomcat服务器 访问表单页面 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <ht

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • vue前端开发辅助函数状态管理详解示例

    目录 mapState mapGetters mapMutations mapActions 示例 小结 mapState 当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余.为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性.不使用mapState时,获取对象状态,通常放在使用组件的computes属性中,使用方式为: //.... computed: { count: function(){ return this.$store.state

随机推荐