• JSP&Servlet学习笔记----第3章


    Web容器是JSP/Servlet唯一认识的HTTP服务器。

    HTTP是基于请求/响应的无状态通信协议。

    流程:

    1、请求来到HTTP服务器

    2、HTTP服务器将请求转交给Web容器

    3、Web容器创建代表当前请求的HttpServletRequest对象与对客户端进行响应的HttpServletResponse

    4、容器根据读取@WebServlet或者web.xml找出处理本次请求的Servlet并调用它的service()方法,HttpServletRequest与HttpServletResponse作为参数。service()方法根据HTTP请求的方式调用对应的doXXX()方法。

    5、在doXXX()方法中可以调用HttpServletRequest与HttpServletResponse对象的相关方法。

    6、最后由Web容器将输出转化为HTTP响应,再由HTTP服务器对浏览器响应。之后容器将HttpServletRequest与HttpServletResponse销毁回收,该次请求响应结束。



    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>HTML范例</title>
    </head>
    <body>
        <form method="get" action="hello.do">
            <fieldset>
                <legend>个人信息</legend>
                用户名:
                <input type="text" name="usr" />
                <br />
                密   码:
                <input type="password" name="pwd">
                <br />
                <input type="radio" name="sex" value="男" checked />男
                <input type="radio" name="sex" value="女" />女
                <br />
                国家:
                <select name="country">
                    <option value="中国">中国</option>
                    <option value="美国">美国</option>
                    <option value="英国">英国</option>
                </select><br />
                爱好:
                <input type="checkbox" name="like" value="足球" />足球
                <input type="checkbox" name="like" value="篮球" />篮球
                <input type="checkbox" name="like" value="排球" />排球
                <br />
                个人说明:
                <textarea name="info" rows="10" cols="30"></textarea>
                <br />
                <br />
                <input type="submit" value="发送" style=""/>
            </fieldset>
        </form>
    </body>
    </html>
    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;
    import java.util.Enumeration;
    
    /**
     * Created by N3verL4nd on 2017/1/4.
     */
    @WebServlet("/hello.do")
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head>");
            out.println("<title>post</title>");
            out.println("</head>");
            out.println("<body>");
    
            //方法1
            request.setCharacterEncoding("UTF-8");
            //取得请求参数
            String usr = request.getParameter("usr");
            String pwd = request.getParameter("pwd");
            //方法2
            //usr = new String(usr.getBytes("ISO-8859-1"), "UTF-8");
            //psd = new String(psd.getBytes("ISO-8859-1"), "UTF-8");
            //输出字符编码信息
            //out.println(request.getCharacterEncoding());
            out.println("<h1>账号:" + usr + "<br />密码:" + pwd + "</h1>");
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置响应内容格式
            response.setContentType("text/html;charset=utf-8");
            //取得输出对象
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head>");
            out.println("<title>get</title>");
            out.println("</head>");
            out.println("<body>");
    
            //1、取得请求参数(Tomcat --> server.xml --> useBodyEncodingForURI="true")
            request.setCharacterEncoding("UTF-8");
            //String usr = request.getParameter("usr");
            //String pwd = request.getParameter("pwd");
            //2、Tomcat容器默认编码为:ISO-8859-1
            //usr = new String(usr.getBytes("ISO-8859-1"), "UTF-8");
            //psd = new String(psd.getBytes("ISO-8859-1"), "UTF-8");
            //out.println("<h1>账号:" + usr + "<br />密码:" + pwd + "</h1>");
    
            Enumeration<String> enumeration = request.getParameterNames();
            while (enumeration.hasMoreElements()){
                String element = enumeration.nextElement();
                if (element.equals("like")){
                    String[] values = request.getParameterValues(element);
                    out.println(element + ":");
                    for (String str : values){
                        out.println(str + ";");
                    }
                    out.print("<br />");
                }
                else{
                    out.println(element + ":" + request.getParameter(element) + "<br />");
                }
            }
    
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
    }






    在Web应用程序中,经常需要多个Servlet来完成请求。

    1、将另一个Servlet的请求处理流程包含进来。

    2、将请求转发给别的Servlet来处理,这个动作在Web容器中进行,浏览器并不知道请求被转发。

    //传送服务器默认的状态和错误
    //response.sendError(HttpServletResponse.SC_NOT_FOUND);
    //要求浏览器重新请求另一个URL
    response.sendRedirect("https://www.baidu.com");
    Include,Forward,sendRedirct的区别

    http://blog.csdn.net/kkdelta/article/details/4129458

    http://blog.csdn.net/evankaka/article/details/45169569


    getWriter和getOutputStream 二者只能选其一,调用了其中一个就不能调用另一个了

    20-Feb-2017 14:12:14.278 严重 [http-nio-8080-exec-6] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Some] in context with path [/jspRun] threw exception
     java.lang.IllegalStateException: getWriter() has already been called for this response
    	at org.apache.catalina.connector.Response.getOutputStream(Response.java:576)
    	at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:194)
    

    我们知道WEB-INF内的文件是不能通过浏览器访问的,但是可以在web容器内访问。

    request.getRequestDispatcher("WEB-INF/web.xml").forward(request, response);
    getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
    getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
    getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  
    getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
    getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容。
    Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 
    Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。


  • 相关阅读:
    用WebStorm运行Vue项目
    秋招圆满结束
    最新的秋招进度 10月21号
    来更新一下秋招的进度~
    华为三面完进池子啦~9月17日
    C++ 迭代器失效问题
    C++类相关问题(空类、多态、重载、继承)
    C++各种变量、类型的存储位置
    写一个面试中场景题的总结
    明天要面阿里HR面了
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616236.html
Copyright © 2020-2023  润新知