Servlet 基础

当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
哪些是get方式呢?
form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候

--

当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法

哪些是post方式呢?
在form上显示设置 method="post"的时候
ajax指定post方式的时候

-- 

service(HttpServletRequest , HttpServletResponse )

实际上,在执行doGet()或者doPost()之前,都会先执行service()

由service()方法进行判断,到底该调用doGet()还是doPost()

可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。

所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。

比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果

--

为了成功获取中文参数,需要做如下操作
1. login.html中加上

 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 


这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码

2. login.html
form的method修改为post

3. 在servlet进行解码和编码

 
byte[] bytes= name.getBytes("ISO-8859-1");
name = new String(bytes,"UTF-8");
先根据ISO-8859-1解码,然后用UTF-8编码

这样就可以得到正确的中文参数了
这样需要对每一个提交的数据都进行编码和解码处理,如果觉得麻烦,也可以使用一句话代替:

request.setCharacterEncoding("UTF-8");
并且把这句话放在request.getParameter()之前


以上是使用UTF-8的方式获取中文呢。 也可以使用GBK。把所有的UTF-8替换为GBK即可。 GB2312同理。

Tomcat默认的编码格式是iso-8859-1,不能表示中文字符。这里我们使用UTF-8字符集表示中文。
“page ”指示该页面中代码的字符编码是UTF-8。“head”指示浏览器使用UTF-8格式进行字符显示。
Tomcat进行文件和网络传输操作时,默认使用的编码格式也是iso-8859-1,这里我们指定传输时的编码格式为“UTF-8”。

--

一个Servlet的生命周期由 实例化初始化提供服务销毁被回收 几个步骤组成
生命周期

实例化:
为LoginServlet显式提供一个构造方法 LoginServlet()

然后通过浏览器访问,就可以观察到
"LoginServlet 构造方法 被调用"

无论访问了多少次LoginServlet
LoginServlet构造方法 只会执行一次,所以Servlet是单实例的

 初始化:

init 方法是一个实例方法,所以会在构造方法执行后执行。

无论访问了多少次LoginSerlvet
init初始化 只会执行一次

提供服务:

接下来就是执行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
在service()中就会编写我们的业务代码,在本例中就是判断用户输入的账号和密码是否正确

销毁

在如下几种情况下,会调用destroy()
1. 该Servlet所在的web应用重新启动
在server.xml中配置该web应用的时候用到了

 
<Context path="/" docBase="e:\project\j2ee\web" debug="0" reloadable="false" />
 


如果把 reloadable="false" 改为reloadable="true" 就表示有任何类发生的更新,web应用会自动重启
当web应用自动重启的时候,destroy()方法就会被调用

2. 关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现。

在web.xml中,配置Hello Servlet的地方,增加一句 

<load-on-startup>10</load-on-startup>

取值范围是1-99

即表明该Servlet会随着Tomcat的启动而初始化。

同时,为HelloServlet提供一个init(ServletConfig) 方法,验证自启动

如图所示,在tomcat完全启动之前,就打印了init of HelloServlet
<load-on-startup>10</load-on-startup> 中的10表示启动顺序
如果有多个Servlet都配置了自动启动,数字越小,启动的优先级越高

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
 
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
        <load-on-startup>10</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
     
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>   
 
</web-app>
import java.io.IOException;
import java.util.Date;
 
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class HelloServlet extends HttpServlet{
     
    public void init(ServletConfig config){
        System.out.println("init of Hello Servlet");
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response){
         
        try {
            response.getWriter().println("<h1>Hello Servlet!</h1>");
            response.getWriter().println(new Date().toLocaleString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
     
}

request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。

<!DOCTYPE html>
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
<form action="register" method="get">
    账号 : <input type="text" name="name"> <br>
    爱好 : LOL<input type="checkbox" name="hobits" value="lol">
        DOTA<input type="checkbox" name="hobits" value="dota"> <br>
       
         <input type="submit" value="注册">
</form>
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class RegisterServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        System.out.println("获取单值参数name:" + request.getParameter("name"));
 
        String[] hobits = request.getParameterValues("hobits");
        System.out.println("获取具有多值的参数hobits: " + Arrays.asList(hobits));
 
        System.out.println("通过 getParameterMap 遍历所有的参数: ");
        Map<String, String[]> parameters = request.getParameterMap();
 
        Set<String> paramNames = parameters.keySet();
        for (String param : paramNames) {
            String[] value = parameters.get(param);
            System.out.println(param + ":" + Arrays.asList(value));
        }
 
    }
 
}

setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享

设置响应编码有两种方式

 
1. response.setContentType("text/html; charset=UTF-8");
2. response.setCharacterEncoding("UTF-8");
 



这两种方式都需要在response.getWriter调用之前执行才能生效。

他们的区别在于

 
1. response.setContentType("text/html; charset=UTF-8");
 


不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

 
2. response.setCharacterEncoding("UTF-8");
 


仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。

原文地址:https://www.cnblogs.com/kakaisgood/p/14109017.html