• 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的时候,就会看到乱码,需要手动再进行一次设置。

  • 相关阅读:
    数据库基础概念及操作语句
    多态、封装、继承的概念。
    排序有几种方式
    构造函数、复制构造函数和析构函数的特性
    String类的构造函数,析构函数、拷贝构造函数和赋值函数
    操作系统中进程调度策略
    静态数据成员和函数
    指针与引用的区别
    const的用法及它在C语言和C++中的不同
    反射性能优化
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/14109017.html
Copyright © 2020-2023  润新知