Servlet与JSP核心编程读书笔记
jsp复习

不能。因为 javabean 是普通的 java 类,MVC 中的 servlet 要完成从客户端接收数据,采用的 servlet 是 HTTP 协议,而普 通的 javabean 不能完成该功能。 2、有人说:JSP 是 Servlet 的高级实现,在 MVC 中,控制器部分应该用 JSP 实现,请您回答 JSP 和 servlet 的异同。 相似:
3. jsp:setProperty:设置 JavaBean 的属性。 4. jsp:getProperty:输出某个 JavaBean 的属性。 5. jsp:forward:把请求转到一个新的页面。 6. jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记 4. 说明 MVC 设计模式中,M、V、C 分别代表什么,有什么作用。 答案:M 代表 Model(模型),该组件是对软件所处理问题逻辑的一种抽象,封装了问题的核心数据,逻辑和功能实现,独立于具体 的界面显示以及 I/O 操作。 V 代表 View(视图),该组件将表示模型数据,逻辑关系以及状态信息,以某种形式展现给用户。视图组件从模型组件获得显示信息, 并且对于相同的显示信息可以通过不同的显示形式或视图展现给用户。 C 代表 Controller(控制器),该组件主要负责用户与软件之间的交互操作,控制模型状态变化的传播,以确保用户界面与模型状态的 统一。5.JavaBean 的主要规范是什么? 5.简述使用 JDBC 技术的主要步骤? 答案: 1.注册和加载驱动器 ; 2.与数据库建立连接; 3.发送 SQL 语句; 4.处理结果; 5.关闭连接; 6.如何连接数据库? 答案: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:数据源名称 "; DriverManager.getConnection(url, "sa", ""); 7.简述 JavaBean 的书写规范。 答案: (1)JavaBean 是一个 public 的类。 (2)类要实现 Serializable 接口 (3)要有一个默认构造函数,以便任何一个容器都可以创建 JavaBean 的实例。 (4) 存放属性的变量为 protected 或 private 特性。 (5)设置和获取属性时,使用 setXXX()和 getXXX()方法。
java web笔记

java web笔记JavaWeb是一种基于Java语言开发的Web应用程序开发技术,其主要模块包括Servlet、JSP、JavaBean以及Java EE(Enterprise Edition)等。
1. ServletServlet是一种Java程序,用于处理HTTP请求和响应。
它可以接收来自客户端的HTTP请求并生成HTTP响应。
Servlet实现了javax.servlet.Servlet接口,可以在Web容器中运行。
Servlet可以通过doGet()、doPost()等方法处理HTTP请求,通过request对象获取请求参数,通过response对象生成响应内容。
Servlet还可以通过init()方法进行初始化,通过destroy()方法进行终止。
2. JSPJSP是Java Server Pages的缩写,它是一种基于HTML和Java 的Web开发技术。
JSP可以将Java代码嵌入到HTML页面中,以便动态生成Web页面。
JSP页面可以使用JavaBean来处理业务逻辑,在JSP中使用标签库可以简化开发,如JSTL标签库、EL表达式等。
3. JavaBeanJavaBean是一种Java类,它封装了应用程序中的数据和业务逻辑。
JavaBean通常包含get/set方法,可以通过这些方法访问和修改JavaBean中的属性。
JavaBean的作用是将数据和业务逻辑分离,使得应用程序具有更高的可维护性和可重用性。
4. Java EEJava EE是Java平台的企业版,它提供了一系列API和规范,用于开发大型分布式Web应用程序。
Java EE包含了Servlet、JSP、JavaBean等技术,还提供了EJB(Enterprise Java Bean)、JPA(Java Persistence API)、JMS(Java Message Service)等高级技术。
Java EE还包含了Web容器和应用服务器,如Tomcat、WebLogic、WebSphere等,这些容器可以运行Java Web程序,提供了对Java Web 程序的支持和管理。
Jsp和Servlet关系

Jsp和Servlet关系为什么会出现Jsp?其实对于服务器来说它只认识Servlet,我们完全可以在Servlet⽤resp.getWriter().write("");画出⽹页的界⾯,但是仅仅⼀个很简单的界⾯就要重复的书写resp.getWriter().write(""),并且这还没有加上js、css以及jquery。
但是我们在Servlet写的是java代码可以有逻辑的判断,但是在html、css中⽆法加⼊逻辑导致页⾯是静态的。
为了解决这⼀问题出现了jsp,在jsp中可以书写Java代码、js代码、html代码等。
我们都知道浏览器发送请求到服务器,服务器通过解析其中Servlet的别名找到对应的Servlet并执⾏其中的service⽅法做出处理和响应,那么对于服务器来说它只认识Servlet,那么我们编辑的Jsp到底是如何被服务器识别的?实际上服务器还是将.jsp当作Servlet的别名在你局部配置下的web.xml找有没有对应的Servlet,如果没有找到对应的Servlet就去Tomcat的公共配置下的web.xml(Tomcat安装⽬录conf下的web.xml)找对应的Servlet。
会找到如下内容:org.apache.jasper.servlet.JspServlet将对应的jsp⽂件转为Servlet。
那么转的Servlet在什么地⽅呢?打开Tomcat下的work⽂件夹⼀直点到:找你正在运⾏的项⽬的jsp测试的jsp:<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body>666</body></html> 被编译好的Java⽂件:/** Generated by the Jasper component of Apache Tomcat* Version: Apache Tomcat/8.5.46* Generated at: 2019-10-16 09:05:10 UTC* Note: The last modified time of this file was set to* the last modified time of the source file after* generation to assist with modification tracking.*/package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports {private static final javax.servlet.jsp.JspFactory _jspxFactory =javax.servlet.jsp.JspFactory.getDefaultFactory();private static java.util.Map<ng.String,ng.Long> _jspx_dependants;private static final java.util.Set<ng.String> _jspx_imports_packages;private static final java.util.Set<ng.String> _jspx_imports_classes;static {_jspx_imports_packages = new java.util.HashSet<>();_jspx_imports_packages.add("javax.servlet");_jspx_imports_packages.add("javax.servlet.http");_jspx_imports_packages.add("javax.servlet.jsp");_jspx_imports_classes = null;}private volatile javax.el.ExpressionFactory _el_expressionfactory;private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;public java.util.Map<ng.String,ng.Long> getDependants() {return _jspx_dependants;}public java.util.Set<ng.String> getPackageImports() {return _jspx_imports_packages;}public java.util.Set<ng.String> getClassImports() {return _jspx_imports_classes;}public javax.el.ExpressionFactory _jsp_getExpressionFactory() {if (_el_expressionfactory == null) {synchronized (this) {if (_el_expressionfactory == null) {_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();}}}return _el_expressionfactory;}public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {if (_jsp_instancemanager == null) {synchronized (this) {if (_jsp_instancemanager == null) {_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());}}}return _jsp_instancemanager;}public void _jspInit() {}public void _jspDestroy() {}public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {final ng.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request. response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");return;}final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;final javax.servlet.ServletContext application;final javax.servlet.ServletConfig config;javax.servlet.jsp.JspWriter out = null;final ng.Object page = this;javax.servlet.jsp.JspWriter _jspx_out = null;javax.servlet.jsp.PageContext _jspx_page_context = null;try {response.setContentType("text/html; charset=ISO-8859-1");pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);_jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;out.write("\r\n");out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">\r\n");out.write("<html>\r\n");out.write("<head>\r\n");out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");out.write("<title>Insert title here</title>\r\n");out.write("</head>\r\n");out.write("<body>\r\n");out.write("666\r\n");out.write("</body>\r\n");out.write("</html>");} catch (ng.Throwable t) {if (!(t instanceof javax.servlet.jsp.SkipPageException)){out = _jspx_out;if (out != null && out.getBufferSize() != 0)try {if (response.isCommitted()) {out.flush();} else {out.clearBuffer();}} catch (java.io.IOException e) {}if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);else throw new ServletException(t);}} finally {_jspxFactory.releasePageContext(_jspx_page_context);}}}但是我们发现这个类并没有继承HttpServlet⽽是继承了org.apache.jasper.runtime.HttpJspBase并且⾥⾯也没有service⽅法⽽是_jspservice⽅法。
黑马程序员_javaweb讲义和笔记资料

黑马程序员_javaweb讲义和笔记资料一、简介黑马程序员是一家专业的IT培训机构,提供全面的编程技术培训服务。
javaweb是其中的一门重要课程,本文为黑马程序员_javaweb讲义和笔记的资料整理。
二、javaweb基础知识1. Java语言概述Java语言的特点和优势,Java开发环境的搭建等。
2. Servlet技术Servlet的基本概念、生命周期、Servlet容器等。
3. JSP技术JSP的基本语法、JSP指令、JSP内置对象等。
4. MVC设计模式MVC设计模式在javaweb开发中的应用和实践。
三、javaweb开发流程1. 需求分析分析项目需求,明确开发目标和功能要求。
2. 数据库设计设计数据库表结构,确定数据存储方式和关系。
3. 技术选型根据项目需求和开发要求,选择合适的技术框架和工具。
4. 编码实现使用Java语言和相关技术进行编码实现。
5. 测试调试运行和调试项目,确保功能的正确性和稳定性。
6. 部署上线将项目部署到服务器上线,提供给用户访问和使用。
四、javaweb开发常用框架和工具1. Spring框架Spring框架的介绍和核心特性,以及在javaweb开发中的应用。
2. SpringMVC框架SpringMVC框架的详细讲解,包括请求映射、数据绑定、视图解析等。
3. MyBatis框架MyBatis框架的使用方法和技巧,以及与数据库的集成。
4. Maven工具Maven的基本使用和配置,常用插件介绍。
五、javaweb开发中的常见问题和解决方案1. 数据库连接异常分析数据库连接异常的原因和解决方法。
2. 页面跳转问题页面跳转的实现方式和常见错误排查。
3. 表单数据验证表单数据验证的常用技术和插件,提高数据输入的准确性和安全性。
4. 性能优化优化javaweb应用的性能,减少响应时间和资源占用。
六、实例项目提供一个实例项目,通过对该项目的讲解和分析,帮助学员理解和掌握javaweb开发的方法和技巧。
第09章 使用EL与JSTL

${msg}
</body> </html>
5
EL也是既可以直接写在HTML的标签内部, 也可以写在某个标签的属性中,例如: <% String s="index.jsp"; request.setAttribute("url", s); %>
<a href="${url}">这是一个超级链接,链接到首页</a> 实际输出: <a href="index.jsp">这是一个超级链接,链接到首页</a>
</body>
18
使用“.”操作符输出JavaBean类型对象的信息
19
“[ ]”操作符
如果从作用域中取出的对象不是映射类型 (Map)或者不是JavaBean的类型,需要使 用“[ ]”操作符处理。
“[ ]”操作符可以处理: 映射类型(Map)对象 JavaBean类型对象 数组类型对象 列表类型(List)对象 (EL3.jsp) (EL4.jsp) (EL5.jsp) (EL6.jsp)
${'a' < 'b'} ${"hip" > "hit"} ${'4' > 3}
false
true false true
10
空运算符
空运算符(empty)用来判断参数是不是null、 空字符串、空数组、空Map或者空集合,如 果是则返回true,否则返回false
EL表达式 ${empty null} ${empty ""} 结果 true true
jsp实验总结

JSP实验总结引言本文档旨在总结和归纳我在JSP实验中的学习经验和心得体会。
在本次实验中,我使用JSP(Java Server Pages)技术开发了一个简单的Web应用程序,通过这个过程,我对JSP的基本概念、工作原理以及与Java的交互有了更深入的理解。
实验背景JSP是一种服务器端的动态网页技术,可以将java代码嵌入到HTML页面中,实现动态生成网页内容的功能。
通过使用JSP,我们可以将视图层的逻辑与业务逻辑分离,提高了代码的可维护性和代码重用性。
实验步骤1. 环境准备在开始实验之前,我先安装了JDK(Java Development Kit)和Tomcat服务器。
JDK是Java开发工具包,它包含了编译Java源代码的编译器和Java虚拟机。
Tomcat是一个开源的Java Servlet容器,用于运行和管理JSP应用程序。
2. 创建JSP页面在我的实验中,我创建了一个名为index.jsp的JSP页面作为我的主页。
我使用了HTML、CSS和JSP标记语言来设计和构建页面布局。
<!DOCTYPE html><html><head><title>My JSP Page</title><style>body {font-family: Arial, sans-serif;margin: 0;padding: 20px;text-align: center;}h1 {color: #1E90FF;margin-top: 100px;}p {color: #808080;}</style></head><body><h1>Welcome to my JSP page!</h1><p>Today's date and time is <%= new java.util.Date() %>.</p></body></html>在页面的header部分,我设置了标题和一些基本的样式。
第2章 JSP语法基础 2.3 JSP指令元素、2.4 JSP动作元素

第2章 JSP语法基础
2.3 JSP指令元素 2.4 JSP动作元素
JSP开发案例教程
本章内容
01 脚本元素 03 JSP指令元素
02 案例ch2.2_datetime: 时间格式化
04 JSP动作元素
05 案例ch2.5_include: 框架类型网页
06 小结与练习
2.3 JSP指令元素
指定在当前页
4
session
中是否允许 10 isThreadSafe 指定是否线程安全
session操作
5
buffer
指定处理页面 输出内容时的 11 缓冲区大小
autoFlush
是定当缓冲区满时是 否自动清空
指定当前页面
说明当前页面是否为
6
errorPage 运行异常时调 12 isErrorPage 其他页面的异常处理
该JSP动作表示获取或创建一个名称为guess的、属于类com.GuessNumber的、生命周期 为session的对象,详见本书案例ch5.4_guessNumber(猜数游戏)。
JSP开发案例教程
所有的动作元素需要两个属性:
id属性
id属性是动作元素的唯一标识,可以在 JSP页面中被引用。动作元素创建的id值 可以通过PageContext来调用。
可以使用绝对或相对URL。 ✓ tagDir属性指示前缀将被用于标识在WEB-INF/tags目录下的标签文件。
2.4 JSP动作元素
JSP开发案例教程
2.4 JSP动作元素
JSP动作元素
➢ JSP动作利用XML语法格式的标记,来控制JSP容器Servlet引擎的行为。 ➢ 利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件
Java编程思想读书笔记

Java编程思想读书笔记这是一份试图提纲挈领的读书笔记,《java编程思想》这本八百多页的书娓娓道来地包含了太多细节,这对读者是非常贴心的,我也强烈建议细细读这本书,如果你希望在短时间内学会java这种语言,那么这本书不是最好的选择,你可以看看谭浩强系列。
我把看这本书的过程中,个人觉得每一章中最重要的思想、用整理在这里,希望自己回顾的时候有所参照和提高。
也希望大家带着同样的目的来看本篇读书笔记。
第一章对象导论比起过程型语言编写的程序,用面向对象语言编写的程序更加简单、易于理解、可复用。
《c++编程思想》里也有这一章,是一个抛砖引自己的玉的章节,不明白可以跳过,回头再看。
第二章一切都是对象java语言里面,一切都是对象,并且程序员是通过引用来操纵对象。
一个简单的例子,非常轻松地让读者进入java 的世界。
需要注意的是java数据会储存在5个不同的地方:寄存器、堆栈、堆、常量存储、非ram存储,用new创建的一般对象都放在堆中,而特殊的基本对象放在堆栈中,如果想把基本对象也放在堆中,需要包装基本类型。
第三章操作符java中的操作符语法类似于c,所以学习起来一点困难也没有。
要特别注意两个比较大的整数相加或者相乘的时候的溢出问题,用long或者biginteger解决这个问题。
第四章控制执行流程我想起《pointer on c》这本书第一章就有这一句话,本书适合那些希望迅速学习一门新语言而不是被“为什么if 和for很重要”的弱智问题耽搁进度的读者。
呵呵,这一章很不厌其烦地介绍了运算、操作符优先级、类型转换、选择循环等基本特性,有c或者c++编程经验的读者可以大概浏览一下。
第五章初始化和清理关于初始化:1.初始化很重要,一定不要忘记。
而且java编译器会很好的防止使用未初始化数据的意外,这是比c和c++更优的地方。
2.编译器初始化的顺序为:a.类首次加载的时候,有关静态初始化的所有动作都会执行。
a1.类的加载包括首次创建该类型的对象,或者该类的静态方法/静态域首次被访问a2.静态域的初始化在一切初始化之前,即静态变量散布在代码不同的地方,它们也会在任何方法(包括构造器)调用之前被初始化b.当用new calssname 创建对象的时候,会在堆上开辟足够的存储空间,这块存储空间被清零,然后执行字段的初始化动作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章servlet 基础1.servlet 的生命周期。
a)init方法:首次创建servlet时,它的init方法会得到调用,因此,init是放置一次性设置代码的地方。
i.可以使用此方法进行常规初始化,用来创建或载入在Servlet生命期内用到的一些数据,或者执行某些一次性的计算。
ii.由初始化参数控制的初始化。
要理解init参数的动机,您需要了解什么样的人可能希望对Servlet的行为方式进行定制。
其中包括:开发人员、最终用户、部署人员。
开发人员通过改变代码改变Servlet的行为。
最终用户通过向HTML表单提供数据改变Servlet的行为。
部署人员为了能够在不修改Servlet的源代码的情况下,就可以将Servlet在机器间移动,以及改变特定的参数(例如,数据库的地址,连接共享大小,或者数据文件的位置)。
init参数的目的就是为了提供这项能力。
b)service方法:在init之后,针对每个用户请求,都会创建一个线程,该线程调用前面创建的实例的service方法。
service方法检查HTTP请求的类型(GET,POST,PUT,DELETE等)并相应地调用doGet,doPost,doPut,doDelete等方法。
c)doGet,doPost和doXxx方法GET请求起因于正常的URL请求,或没有指定METHOD的HTML表单。
POST请求起因于特别将POST列为METHOD的HTML表单。
你可以覆盖doGet和/或doPost方法来处理。
DELETE 请求由doDelete处理,PUT 由doPut方法处理,OPTIONS 由doOptions处理,TRACE 由doTrace方法处理。
OPTIONS和TRACE的请求在Servlet中是自动支持的。
doHead以处理HEAD请求(HEAD请求规定,服务器应该只返回正常的HTTP 头,不含与之相关联的文档)。
为了能够更快地生成对HEAD请求的响应(例如来自定制客户的请求,只需要HTTP报头,不需构建实际的文档输出),会实现doHead方法。
2.SingleThreadModel接口a)通过让Servlet实现这个接口,系统会保证不会有多个请求线程同时访问该servlet的单个实例。
大多数和情况下,系统将所有的请求排队,一次只将一个请求转给单个servlet实例。
b)此接口已经过时,如果要同步最好使用synchronized关键字。
第4章客户请求的处理:表单数据1.表单数据的读取。
a)单个值的读取:getParameter(表单项名称),表单项名称大小写敏感。
如果表单项存在但没有相应的值,返回空的String;如果没有这样的表单项,则返回null。
b)多个值的读取:getParameterValues(表单项名称),如果同一表单项名称在表单数据中多次出现,则应该调用getParameterValues(返回字符串的数组)。
对于不存在的表单项名称,getParameterValues的返回值是null,如果参数只有单一的值,则返回只有一个元素的数组。
如果是HTML表单的设计者,最好保证每个文本字段、复选框或其他用户界面元素都有一个唯一的名称。
2.参数名的查找:getParameterNames和getParameterMapgetParameterNames以Enumeration的形式返回表单项名称列表,其中的的每一项都可以转换成String,并可以用在getParameter或getParameterValues调用中。
如果当前请求中没有表单名称返回空的Enumeration(不是null)。
Enumeration只是一个接口,它保证实际的类实现了hasMoreElements和nextElement方法:它并不保证具体的实现会采用某种特定的底层数据结构。
getParameterNames的替代方案是getParameterMap。
这个方法返回一个Map:表单名称(字符串)是表的键,表单项的值是表的值。
3.读取上载的文件和原始数据:getReader或getInputStream当数据不是HTML表单提交,而是来自于定制的客户程序时,可能需要自己读取和分析这些数据。
最常见的客户程序是applet。
当数据来自于上载的文件时,可能需要自己读取数据。
servlet的API没有定义任何机制来读取<input type=”file”>元素的文件。
4.多字符集输入的读取:setCharacterEncoding(字符集名称)request.getParameter使用服务器的当前字符集解释输入。
要改变这种默认行为,需要使用ServletRequest的setCharacterEncoding方法。
setCharacterEncoding必须在访问任何请求参数之前调用。
我们可以按照某个字符集读取参数,然后将它转换到另外的字符集;或者用某些字符集提供的自动检测特性。
第一种方案:使用getByte提取出原始的字节数据,之后将这些字节连同期望字符集的名称一同传递给String的构造函数。
例:String firstNameWrongEncoding = request.getParameter(“firstName”);String firstName = new String(firstNameWrongEncoding.getBytes(), “shift_JIS”);第二种方案:需要使用一种支持从默认字符集进行检测和转换的字符集。
例:如果允许输入既可以是英语,也可以是日语,则要使用下面的语句:request.setCharacterEncoding(“JISAutoDetect”);String firstName = request.getParameter(“firstName”);5.参数缺失或异常时默认值的应用如果用户没有提供必需的信息,那么该servlet应该怎么处理这种情况a)使用默认值b)重新显示这个表单(提示用户缺失的值)。
c)请求中的参数需要检查下面三种情况:i.参数的值为null用户使用了错误的表单或使用了包含GET数据的URL书签,但在制作URL书签之后,参数名发生变化,都会发生返回值为null的情况。
ii.参数的值为空字符串(“”)用户没有输入指定的值。
为了安全起见,最好调用trim,移除用户可能输入的任何空格。
iii.参数的值为非空字符串,但格式错误在长度和类型(只要求数值的字段)上输入错误。
在设计servlet时,要使之能够优雅地处理参数缺失(null或空字符串)或格式不正确等情况。
6.过滤字符串中的HTML特殊字符a)如果servlet希望生成含有诸如<或>等字符的HTML,只需简单地使用标准的HTML字符实体——<或>。
b)如果您需要读取请求参数,并将它们的值显示在生成的页面中,则必须过滤出那些特殊的HTML字符。
不这样做可能会导致输出中缺失部分,或者某些部分格式错误。
c)Java字符串虽不可改变的(即不能修改),因此,重复的字符串拼接操作需要复制许多字符串片段,并在使用后废弃。
建议在循环中执行重复性的拼接操作时,应该使用可以改变的数据结构:StringBuffer是通常的选择。
7.根据请求参数自动填充Java对象:表单beana)普通的Java对象,如果它所属的类使用私有字段,且拥有遵循get/set命令约定的方法,则可以看作是bean。
方法名(除去单词“get”或”set”,并且首字母小写)称为属性(property)。
8.当参数缺失或异常时重新显示输入表单。
a)由同一servlet提供表单、处理数据并提供最后的结果。
表单省略Action属性,从而,表单提交时会自动发送到表单自身的URL。
b)由一个servlet提供表单:由第二个servlet处理数据并提供结果。
从一个servlet转到另外的servlet可以使用response.sendredirect或RequestDispatcher的forward方法。
将数据从负责处理的servlet传递回显示表单的servlet时,最简单的方式是将它存储在HttpSession对象中。
c)由一个JSP页面“手动地”提供表单:由一个servlet或JSP页面处理数据并提供结果。
d)由一个JSP页面提供表单,用从数据对象获取的值自动填写表单中相应的字段:由一个servlet或JSP页面处理这些数据并提供最终结果。
第5章客户请求的处理:HTTP请求报头1.简介:请求报头在JSP中的读取及应用与在servlet中相同。
请求报头由浏览器间接地设定,并紧跟在初始的GET和POST请求行之后发送。
2.请求报头的读取。
只需用报头的名称为参数,调用HttpServletRequest的getHeader方法。
如果当前的请求中提供了指定的报头,则这个调用返回一个String,否则返回null。
在HTTP1.0中,请求的所有报头都是可选的:在HTTP1.1中,只有Host是必需的。
因而,在使用请求报头之前一定要检查是否为null。
报头名称对大小写不敏感。
a)访问HTTP报头的方法汇总。
getHeader是读取输入报头的通用方式。
访问其他常用报头的方法有:i.getCookies方法返回Cookie报头的内容。
ii.getAuthType和getRemoteUser返回Authorization报头进行拆分,分解成它的各个构成部分。
iii.getContentLength返回Content-Length 报送的值(作为一个int值返回)iv.getContentType返回Content-Type报头的值(作为一个String返回)v.getDateHeader 和getIntHeader读取指定的报头,然后分别将它们转换成Date和int值。
vi.getHeaderNames可以使用此方法得到一个Enumeration,枚举当前特定请求中所有的报头名称。
vii.getHeaders大多数情况下,每个报头名称在请求中只出现一次。
然而,报头偶尔也有可能出现多次,每次出现列出各自的值。
可以使用此方法得到一个Enumeration,枚举报头每次出现所对应的值。
b)获取主请求行自身的信息,同样是使用HttpServletRequest提供的方法:i.getMethod返回主请求方法(一般是GET或POST,也有可能是HEAD,PUT和DELETE方法)ii.getRequestURI返回URL中主机和端口之后,但在表单数据之前的部分。
例:/servlet/search.BookSearch?subject=jsp,getRequestURI返回“/servlet/search.BookSearch”。