我们使用网络提交数据到服务器的时候,tomcat服务器对于请求到servlet类的数据处理过程是这样的:首先进入该Web应用下的web.xml配置文件,根据servlet配置好的映射名查找到指定了servlet类生成的字节码文件目录的servlet名称。实例化servlet。初次访问servlet时,tomcat对于servlet的生命周期管理如下:加载类->实现构造方法—>init()->service()-doGet()/doPose()..。之后再有数据访问到servlet时,重复执行service()-doGet()/doPose()..的操作。关闭服务器时,先执行servlet的destroy()方法,最后关闭服务器。

    由以上的信息,我们可以知道,一个类型的servlet在同一个服务器中之实例化一个,也就是说servlet的访问是多线程的。所以我们尽量不在在servlet里面定义成员属性(限制了servlet的使用范围)。关于servlet的生命周期和多线程的访问管理,由服务器来完成。以下,通过一些常见的操作,来初见servlet的使用。


最简单的servlet

    1.新建Web应用,并创建一个集成javax.servlet.http.HttpServlet的子类并且重写doGet()方法,类的创建如下:

package servlet;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class LBCServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

PrintWriter outWriter = resp.getWriter();

outWriter.print("Hello,Servlet!");

outWriter.flush();

outWriter.close();

}

}


    2.配置servlet

    (1)指定servlet所在位置配置servlet的名称:   

      <!-- 配置servlet名称 -->

      <servlet>

      <servlet-name>LBCServlet</servlet-name>

      <servlet-class>servlet.LBCServlet</servlet-class>

      </servlet>

     (2)根据servlet名称配置servlet的外部访问路径:

     <!-- 配置servlet的映射路径 -->

      <servlet-mapping>

  <servlet-name>LBCServlet</servlet-name>

        <!-- 这里使用到“/”表示所在位置为当前Web应用目录下 -->

  <url-pattern>/LBCServlet</url-pattern> 

     </servlet-mapping>

    3.发布该Web应用,在浏览器输入servlet的地址:该web应用根目录/LBCServlet,得到:

Hello,Servlet!


处理servlet的乱码问题:

    1.设置eclipse全局编码格式

wKiom1awxCiwyd7rAAH6xw9oqik233.png

    2.设置当前文件的编码格式

    

wKioL1awxR_AwuGfAADtO6fpUfg519.png

wKiom1awxNKhlsgeAAHBnapTlnQ825.png

     3.设置tomcat的编码格式

    wKiom1awxTTDi2GLAAAj9fIbbm0932.png

    4.代码内设置编码格式

    resp.setContentType("text/html; charset=utf-8");

    5.同一浏览器的编码格式,因为不同的浏览器切换显示编码格式的步骤不同,在这里不做累述


实现简单夜间交互的servlet

    1.设置HTML页面表单form文件

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>Insert title here</title>

</head>

<body>

<form action="LBCServlet" method="get">

用户名:<input type="text" name="user"><br/>

账号:<input type="text" name="acount"><br/>

<input type="checkbox" name="hobies" value="吃饭">吃饭饭

<input type="checkbox" name="hobies" value="睡觉">睡觉觉

<input type="submit" value="提交数据"> 

</form>

</body>

</html>

    2,设置servlet

package servlet;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class LBCServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 获取方法

req.setCharacterEncoding("utf-8");

String user = req.getParameter("user");

String acount = req.getParameter("acount");

String[] hobies = req.getParameterValues("hobies");

System.out.println("用户名:"+user);

System.out.println("账户:"+acount);

System.out.print("爱好:");

if (hobies!=null) {

for (String string : hobies) {

System.out.print(string+"  ");

}

}

resp.sendRedirect("success.html");

}

}

    3.配置servlet

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>LBCServlet</display-name>

  

  <!-- 配置servlet名称 -->

  <servlet>

  <servlet-name>LBCServlet</servlet-name>

  <servlet-class>servlet.LBCServlet</servlet-class>

  </servlet>

  

  <!-- 配置servlet的映射路径 -->

  <servlet-mapping>

  <servlet-name>LBCServlet</servlet-name>

  <url-pattern>/LBCServlet</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

  </welcome-file-list>

</web-app>

    4.编写返回页面

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

欢迎光临LBC测试系统

</body>

</html>


获取页面和servlet设置页面跳转的方式有以下几种:

     1.使用getParameterNames()和服务器内页面跳转技术

package servlet;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import sun.nio.cs.ext.GBK;


public class LBCServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 不知道参数名

//req.setCharacterEncoding("GBK");

Enumeration parameterEnumeration = req.getParameterNames();

while(parameterEnumeration.hasMoreElements()){

String parameterName = (String)parameterEnumeration.nextElement();

String parameterValue = req.getParameter(parameterName);

System.out.println(parameterName+":"+parameterValue);

}

// 使用服务器内跳转

RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");

dispatcher.forward(req, resp);

}

}


    2.使用getParameterMap()

package servlet;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import sun.nio.cs.ext.GBK;


public class LBCServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 不知道数据名

Map parameterMap = req.getParameterMap();

Set parameterKey = parameterMap.keySet();

Iterator parameterItr = parameterKey.iterator();

while(parameterItr.hasNext()){

String key = (String) parameterItr.next();

String[] values = (String[]) parameterMap.get(key);

for (String string : values) {

System.out.println(string);

}

}

// 使用服务器内跳转

RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");

dispatcher.forward(req, resp);

}

}


    我们使用

        RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");

dispatcher.forward(req, resp);

        实现服务器内跳转减少客户端与服务器的请求次数,如果在servlet之间跳转数据时需要传递参数,我们需要使用到setAttitude(参数名,参数值)和getAttitude(参数名)来实现参数之间的传递。