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时遇到的概念、操作、应用或认证考试等问题及解决方案。 本书针对Servlet 3.0的新功能全面改版,无论是章节架构与范例程序代码,都...
**JSP(Java Server Pages)与Servlet...这个**[JSP&Servlet学习笔记(第2版)]**会涵盖这些主题,并可能包括示例代码、最佳实践和常见问题解答,帮助读者全面掌握JSP和Servlet的使用技巧,进一步提升Java Web开发能力。
吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案 本资源为吉林大学珠海学院JSP&Servlet学习笔记(第二版)的课后答案,涵盖了JSP和Servlet相关的知识点。本笔记共分为九章,每章节都包含了相关的问题答案,...
书 名:JSP & Servlet学习笔记(第2版) 作 者:(台湾)林信良 著 出 版 社:清华大学出版社 出版时间:2012-5-1 ISBN:9787302283669 纸书页数:456页 定 价:¥ 58.00 内容简介: 本书是作者多年来...
JSP Servlet 学习笔记 第2版 林信良 随书光盘 第3卷
根据提供的文件信息,标题为“JSP&Servlet学习笔记(第2版)_打印版”,描述指出文档经过空白边裁剪处理以便于打印。虽然提供的部分内文无法直接转化为明确的知识点,但我们可以根据标题和描述推测该文档的主要内容,...
学习笔记"及提供的源码,开发者可以全面了解JSP和Servlet的工作原理,学会如何创建动态Web应用,同时提升解决问题和实际开发的能力。结合实际项目练习,能够更好地将理论知识转化为实践经验,从而在Java Web开发领域...
**《JSP&Servlet学习笔记 第二版 林信良》:** 这本书是学习JSP和Servlet的优秀资源,作者林信良以通俗易懂的方式讲解了这两个技术的核心概念、工作原理和实际应用。书中可能涵盖了JSP的指令、动作、表达式和脚本...
### Servlet&JSP 学习笔记精要 #### 一、Servlet 基础 ##### 1.1 Web 容器 - **概念**: Web 容器是支持 Servlet 和 JSP 运行的基础环境,主要功能是加载和管理 Servlet 实例,处理客户端请求并返回响应。常见的 ...
Servlet&JSP课后习题解答 Servlet是Java EE规范中的一部分,用于开发基于Web的应用程序。它可以处理HTTP请求,生成动态网页,并与数据库进行交互。JSP(Java Server Pages)是Servlet的扩展,允许开发者使用HTML和...
【描述】"day04-Tomcat&Servlet入门-讲义.zip"暗示这是一份教学材料,可能包含第四天课程的学习笔记或讲义,专注于初学者如何开始使用Tomcat和Servlet进行Web开发。学习者将通过这份资料了解到如何配置和管理Tomcat...
由于直接学习笔记的内容没有给出具体的实例代码和详细解释,所以这里只提供了理论层面的知识点。如果需要学习具体实现,可以寻找相关的教程和项目实践来加深理解。同时需要注意的是,由于JSP/Servlet技术相对老旧,...
在本篇学习笔记中,我们将深入探讨与Java Servlet相关的知识点,包括其工作原理、生命周期、配置以及实际应用。 首先,了解Servlet的工作原理至关重要。当一个HTTP请求到达服务器,Web容器(如Tomcat)会识别请求的...
《JSP动态网站开发实践教程(第2版)源代码》是学习JSP技术的宝贵资源,它提供了丰富的实例和实战经验,旨在帮助开发者深入理解JSP在构建动态网站中的应用。通过分析和实践这些源代码,我们可以掌握JSP的核心概念、...
### 良葛格JspServlet学习笔记 #### 一、引言 在现代Web开发领域,特别是Java EE平台中,JSP (JavaServer Pages) 和 Servlet 技术扮演着非常重要的角色。这两种技术共同构成了Java Web应用的基础,分别侧重于用户...
### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...
第三篇为“JSP技术基础”,主要讲述JSP的基本语法和内建对象及JSP和Servlet的集成,JavaBean和表达式语言;第四篇为“数据库访问技术”,主要讲述JDBC技术及JSP和Servlet如何通过JDBC访问数据库,以及如何改进数据库...
对于初学者,可以通过以下途径学习JSP-Servlet技术: 1. **官方文档**:Oracle提供了详细的Java Servlet和JSP规范文档。 2. **在线教程**:网站如W3School、教程网等提供了丰富的教程和示例代码。 3. **书籍**:如...
这篇学习笔记将深入探讨这两个概念,以及它们在实际开发中的应用。 Servlet是Java编程语言的一个接口,由Sun Microsystems(现为Oracle)定义,它允许Java代码与HTTP服务器交互。Servlet主要负责处理客户端的请求并...
**JSP完整学习笔记概述** 本笔记是作者在专业培训学校学习JSP的总结,旨在为读者提供一个全面了解和掌握JavaServer Pages (JSP) 技术的资源。JSP是Java平台上的动态网页技术,它允许开发人员将静态HTML内容与动态...