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方法关闭该输出流对象。

JSP&Servlet学习笔记----第3章的更多相关文章

  1. JSP&Servlet学习笔记----第6章

    JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...

  2. JSP&Servlet学习笔记----第5章

    Servlet进阶API 每个Servlet都必须由web容器读取Servlet设置信息(标注或者web.xml).初始化. 对于每个Servlet的设置信息,web容器会为其生成一个ServletC ...

  3. JSP&Servlet学习笔记----第4章

    HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...

  4. JSP&Servlet学习笔记----第1/2章

    HTML(HyperText Markup Language):超文本标记语言 HTTP(HyperText Transfer Protocol):超文本传输协议 URL(Uniform Resour ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. 【JSP&Servlet学习笔记】5.Servlet进阶AIP、过滤器与监听器

    Servlet接口上,与生命周期及请求服务相关的三个方法是init().service()与destory()方法.当Web容器加载Servlet类并实例化之后,会生成ServletConfig对象并 ...

  7. JSP Servlet学习笔记——使用fileupload上传文件

    关键代码如下: index.jsp <body> <center> <h3>文件上传</h3> <font color="red&quo ...

  8. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  9. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

随机推荐

  1. 「BZOJ4510」「Usaco2016 Jan」Radio Contact 解题报告

    无线电联系 Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the cow has agreed t ...

  2. 啊哈!C语言课后参考答案上

    最近看到一本好评量很高的的C语言入门书,课本真的很好,入门的话.专业性没有那么强,但入门足够了!!好评!看着看着就想把这本书的题课后习题都写出来,最后就有了这个小结.可能有的不是最好,不那么专业,但主 ...

  3. 6.6 hadoop作业调优

    提高速度和性能.可以从下面几个点去优化 可以在本地运行调试来优化性能,但是本地和集群是完全不同的环境,数据流模式也截然不同,性能优化要在集群上测试.有些问题如(内存溢出)只能在集群上重现. HPROF ...

  4. Spark学习笔记(一)——基础概述

    本篇笔记主要说一下Spark到底是个什么东西,了解一下它的基本组成部分,了解一下基本的概念,为之后的学习做铺垫.过于细节的东西并不深究.在实际的操作过程中,才能够更加深刻的理解其内涵. 1.什么是Sp ...

  5. (数据科学学习手札72)用pdpipe搭建pandas数据分析流水线

    1 简介 在数据分析任务中,从原始数据读入,到最后分析结果出炉,中间绝大部分时间都是在对数据进行一步又一步的加工规整,以流水线(pipeline)的方式完成此过程更有利于梳理分析脉络,也更有利于查错改 ...

  6. json中含有换行符'\r','\n'的处理

    一.josn简易说明  json是一种轻量级的数据交换格式,是一系列格式字符串.在数据交换中,经常会使用到,具有易读性,轻量级.很多地方会使用到,用处广泛.如下:(截取的一段json体) " ...

  7. 修饰符new与override

    new:在作为修饰符时,可以隐藏从父类的继承的成员. override:修改父类的方法.属性. 上代码比较清楚: using System; using System.Collections.Gene ...

  8. 案例分析丨谷歌设计冲刺 4 天决定 Clips 的功能特性

    这次为大家带来Google冲刺日程案例,之前案例分析可以戳对应文字直达:ING集团.音乐流媒体Spotify.美国知名超市Target 作为一款工具类产品,谷歌十分注重产品候选人的技术背景,同时也看重 ...

  9. 一些常用查询SQL语句以及显示格式

    1.查询当前年.月.周相关时间 1.1.查询当前年份 SELECT TO_CHAR(SYSDATE,'YYYY') AS YEAR FROM DUAL--查询当前年份 SELECT TO_CHAR(S ...

  10. 三、Nginx原理解析

    Nginx原理解析 一.反向代理 工作流程 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址: 反向代理服务器接受用户的请求: 反向代理服务器在本地缓存中查找 ...