Servlet规范核心类图

1、请求和响应对象

==> HTTP协议包含请求和响应部分。

==> HttpServletRequest就代表着请求部分

==> HttpServletResponse就代表着响应部分

2、HttpServletRequest详解

代表着客户端的请求。要客户的信息只要找这个对象即可,该对象由容器创建。

(1)常用表单数据的获取A、获取指定名称的参数值,public String getParameter(String name);如:

==>

==> html或jsp代码:

<form action="parameter" method="post">
<input type="text" value="小易" name="username" />
<input type="password" value="123456" name="password" />
<input type="submit" value="提交" />
</form>

==> Java代码(注意设置req和resp的字符编码):

String username= req.getParameter("username"); //结果:小易

String password= req.getParameter("password"); //结果:123456

==> web.xml的配置:

<!-- Web项目名 -->
<display-name>parameter</display-name> <!--注册HelloServlet -->
<servlet>
<!-- 给servlet签名 -->
<servlet-name>parameter</servlet-name>
<!-- 指定要注册的Servlet,即对于src目录中的类 -->
<servlet-class>com.smalle.servlet.GetParameterServlet</servlet-class>
</servlet>
<!-- Servlet映射 -->
<servlet-mapping>
<!-- 给Servlet签名 必须和某个Servlet的签名必须一致。 -->
<servlet-name>parameter</servlet-name>
<!-- 浏览器截获的请求地址,此处必须加/ -->
<url-pattern>/parameter</url-pattern>
</servlet-mapping>

==> 在浏览器中输入:http://localhost:8080/testServlet 回车,回跳转到index.jsp,输入后,点击提交,地址栏会跳转到http://localhost:8080/testServlet/parameter 并显示结果

B、获取指定名称的值的数组: public String[] getParameterValues(String name)一般用来处理表单中的复选框。如:

寒冰流浪盖伦

==> html或jsp代码(form表单省略,同上):

<input type="checkbox" value="寒冰"name="lol" />寒冰 <input type="checkbox" value="流浪"name="lol" />流浪 <input type="checkbox" value="盖伦"name="lol" />盖伦

==> Java代码:

String[] lol = req.getParameterValues("lol"); //全选的话结果:[寒冰,流浪,盖伦]

表单输入域类型:radio checkbox,选择后把他们的value的取值提交给服务器。即使表单中有对应名称输入域,如果一个不选择,则什么数据不会带给服务器(当什么都不选时,就会报空指针异常)

(2)返回所有请求中的参数名public Enumeration getParameterNames()

(3)返回请求中所有参数名和值的Map对象public Map getParameterMap()其中Map对象中的key是字符串类型,value对应的Object类型

(4)获取请求消息头:通过枚举类型获取请求文件的头部信息集(还可以利用浏览器的DeBug功能查看)

resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter(); Enumeration<String> headNames = req.getHeaderNames();
while(headNames.hasMoreElements()){
String name=(String)headNames.nextElement(); //取出信息名
String value = req.getHeader(name); //取出信息值
out.println(name + " = " + value); out.flush();
out.close(); //关闭流
}
/*取出的信息名结果为
host
connection
cache-control
accept
user-agent
accept-encoding
accept-language
*/

(5)ServletRequest也是一个域对象(内部维护了一个Map<String,Object>)

==> Object getAttribute(Stirng name)

==> void setAttribute(String name,Object value)

==> void removeAttribute(String name)

==> getAttributeNames

这种存储中HttpServletRequest对象中的数据。属于同一个请求和响应过重才能有效。而对于重定向这这种存储数据的方式就没有意义。注意一点就是:这种方法的数据存储只在一次request/response中

(6)关于编码格式

浏览器当前使用什么编码,就以什么编码提交请求参数。<meta http-equiv="content-type" content="text/html; charset=UTF-8">

req.setCharacterEncoding(编码):通知程序,客户端提交的数据使用的编码。但是只对POST请求方式有效,如果是get请求提交数据,编码就是ISO-8859-1,目前采用的一般是POST提交方式。

3、HttpServletResponse详解

(1)关于编码格式:

==> 字节流:out.write("中文".getBytes("UTF-8"));有乱码

解决办法:

方式一:更改浏览器的查看编码(不可取)

通知浏览器,使用的码表,方式二、三、四都是一样的

方式二:resp.setContentType("text/html;charset=UTF-8");

方式三:resp.setHeader("Content-Type", "text/html;charset=UTF-8");

方式四:resp.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes("UTF-8"));

==> 字符流:

Servlet中的字符流默认查ISO-8859-1(SUN的Servlet规范要求的)

更改这个默认的编码:resp.setCharacterEncoding("UTF-8"); (对于请求对象req.setCharacterEncoding("UTF-8");)

在字符流输出中文数据时:resp.setContentType("text/html;charset=UTF-8");

有两个作用:通知字符流以UTF-8编码输出,通知客户端以UTF-8解码显示

(2)如果没有resp.setContentType("text/html;charset=UTF-8"); 直接写PrintWriter out = resp.getWriter();

out.println();会当记事本形式写到浏览器上(会换行)

out.write();会当记事本形式写到浏览器上(不会换行)

(3)HttpServletResponse细节:

字节流和字符流不能同时使用,互斥的。

通过字符流或字节流输出的数据并不是直接打给浏览器的。而是把数据写到response对象的缓存中的。服务器从缓存中取出数据,按照HTTP协议的响应格式输出给浏览器。

如果你调用的response的输出流没有主动关闭,服务器会替你关的。

4、请求分派和重定向

(1)请求分派

==> 使用方法,如:req.getRequestDispatcher("failed.html").forward(req, resp);

==> 说明:

Servlet中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:

public void forward(ServletRequest request,ServletResponse response);

public void include(ServletRequest request,ServletResponse response);

==> 原理:请求转发借助于RequestDispatcher,得到RequestDispatcher对象的方法

方式一:ServletContext.getRequestDispatcher(目标资源的URI);

方式二:ServletRequest.getRequestDispatcher(目标资源的URI);

区别:方式一中的目标资源的URI必须以"/"开头,否则报错,此"/"就表示的是当前应用(绝对路径表示法)。方式二中的目标资源的URI如果以"/"开头,就表示的是当前应用(绝对路径表示法)。如果不以"/"开头,就表示相对路径。

(2)重定向

==> 使用方法,如:resp.sendRedirect("success.html");

==> 说明:

HttpServletResponse接口提供方法public void sendRedirect(String location) throws IOException

(3)请求分派和重定向的区别

HttpServletResponse的sendRedirect()方法和RequestDispatcher的forward()方法都可以让浏览器获得另一个URL所执行的资源然后做出响应。两者之间的区别如下:

==>

请求分发:服务器行为,浏览器发送一次请求,地址栏显示的URL不改变。参数不会丢失

重定向:浏览器行为,浏览器发送两次请求,地址栏显示的URL改变。一般用于提示页面,容易丢失参数,利用get(?参数名=参数值)方式解决参数丢失

==>

请求分派:只能将请求转发给同一个Web应用中的其他组件

重定向:不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上

==>

请求分派:发起者和被调用者之间共享相同的request实例和response实例。它们之间属于同一个请求对象和响应对象。(request/response)

重定向:发起者和被调用者使用各自的request实例和response实例。它们各自属于独立的请求对象和响应对象(request/response)

5、绝对路径和相对路径

==> 绝对路径是指:是以“/”开头的路径,指向的是Web应用的根目录的路径

==> 相对路径是指:不是以“/”开头的路径。指向的相对于当前路径的路径

==> 如:现在又一个工程名为servlet的项目。下面有一个test的目录,其中有loginServlet

这个项目的绝对路径是:http://服务器名或者ip地址:端口号/servlet/loginServlet

这个项目的相对路径是:http://服务器名或者ip地址:端口号/servlet/test/loginServlet(对于test目录来说,他的相对路径就是servlet)

6、ServletConfig和ServletContext

Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。ServletConfig对象进行了对Servlet中在web.xml中配置参数的读和写。

(1)ServletConfig

==> 常用方法:getInitParameterNames,getInitParameter,getServletName,getServletContext

==> 举例

	==> java代码
//获取上下配置文件对象
ServletConfig servletConfig = this.getServletConfig();
String name = servletConfig.getInitParameter("name"); //获取名字
String age = servletConfig.getInitParameter("age"); //获取年龄 resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
out.write("name: " + name + " ; " + "age: " + age);
-------------------------------------------------------
==> web.xml代码
<servlet>
<servlet-name>servletConfig</servlet-name>
<servlet-class>com.smalle.servlet.ServletConfigServlet</servlet-class>
<span style="color:#ff0000;"><init-param>
<param-name>name</param-name>
<param-value>小易</param-value>
</init-param></span>
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletConfig</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
-------------------------------------------------------
==>结果:输入:http://127.0.0.1:8080/testServlet/config,显示 name: 小易 ; age: 18

(2)ServletContext

==> 在应用被服务器加载时就创建ServletContext对象的实例。每一个JavaWeb应用都有唯一的一个ServletContext对象,它就代表着当前的应用。由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象被称之为application对象(Web应用程序对象)

==> 得到ServletContext对象:ServletConfig.getServletContext();

==> 功能:

A、ServletContext对象是一个域对象(域对象就是说其内部维护了一个Map<String,Object>)

Object getAttribute(String name):根据名称获取绑定的对象

Enumeration getAttributeNames():获取ServletContext域中的所有名称

void removeAttribute(String name):根据名称移除对象

void setAttribute(String name,Object value):添加或修改对象

B、实现多个Servlet之间的数据共享

C、获取WEB应用的初始化参数(应用的全局参数)

如在web.xml的根元素下配置一下信息:

<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>

</context-param>

这些参数就属于整个应用的全局参数,使用ServletContext来读取

D、读取资源文件位置的三种方式

利用ServletContext.getRealPath(),特点:读取应用中任何文件。只能在Web环境下用。用于返回某个虚拟路径所映射的本地文件系统路径

利用ResourceBundle读取配置文件,特点:可以用在非web环境下。但是只能读取类路径中的properties文件

利用类加载器读取配置文件(专业),特点:可以用在非web环境下。可以读取类路径下的任何文件。

==> 实例:

	==> java代码
ServletContext servletContext = this.getServletContext();
String encoding = servletContext.getInitParameter("encoding");
resp.setCharacterEncoding(encoding);
PrintWriter out = resp.getWriter();
out.println("encoding的值为" + encoding + " , 此时可以显示中文说明获取encoding成功"); String url = servletContext.getRealPath("index.jsp");
out.println("index.jsp的路径为: " + url);
-------------------------------------------------------
==> web.xml代码
<!-- 全局参数,对所有的servlet有效,都可以获取对应的参数值 -->
<span style="color:#ff0000;"><context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param></span> <servlet>
<servlet-name>ServletContext</servlet-name>
<servlet-class>com.smalle.servlet.ServletContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
-------------------------------------------------------
==>结果:输入:http://127.0.0.1:8080/testServlet/context,显示:
encoding的值为UTF-8 , 此时可以显示中文说明获取encoding成功
index.jsp的路径为: D:\Java\tomcat6\webapps\testServlet\index.jsp

7、其他

(1)获取请求行的相关信息

getMethod方法返回HTTP请求消息中的请求方式

getRequestURI方法返回请求行中的资源名部分

getQueryString 方法返回请求行中的参数部分

getProtocol方法返回请求行中的协议名和版本

getContextPath方法返回请求资源所属于的WEB应用程序的路径

getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头

getPathTranslated方法返回URL中的额外路径信息所对应的资源的真实路径

getServletPath方法返回Servlet的名称或Servlet所映射的路径

(2)获取网络连接信息

getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.1”这种形式的字符文本

getRemoteHost方法返回发出请求的客户机的完整主机名,即“www.zxitb.com”这种格式

getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号

getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址

getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名

getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号

getServerName方法返回当前请求所指向的主机名

getServerPort方法返回当前请求所连接的服务器端口号

getScheme方法返回请求的协议名,例如http、https或ftp

getRequestURL方法返回客户端发出请求时的完整URL

(3)获取请求头信息

getHeader

getHeaders

getHeaderNames

getIntHeader

getDateHeader

getContentType

getContentLength

getCharacterEncoding

(4)获取请求参数

getParameter

getParameterValues

getParameterNames

getParameterMap

servlet(4) - servletAPI - 小易Java笔记的更多相关文章

  1. servlet(6) - servlet总结 - 小易Java笔记

    垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...

  2. JSP(3) - 9个JSP内置对象 - 小易Java笔记

    1.9个JSP内置对象 内置对象引用名称     对应的类型 request HttpServletRequest response HttpServletResponse config Servle ...

  3. servlet(3) - servlet知识点 - 小易Java笔记

    1.servlet的生命周期 (1)容器最终要调用service方法为客户进行服务.(此处“容器”指java运行的环境,tomcat是jsp/servlet的容器) ==> 在内存中一个Serv ...

  4. servlet(2) - 利用MyEclipse新建一个servlet - 小易Java笔记

    1.Tomcat在MyEclipse中集成 ==> Window-preferences-MyEclipse-Servers-Tomcat-Tomcat 6.x-点击右侧的Browse,选择你的 ...

  5. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...

  6. servlet(5) - Cookie和session - 小易Java笔记

    1.会话概述 (1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. (2)会话过程中的数据不宜保存在request和servle ...

  7. JSP(2) - JSP指令 - 小易Java笔记

    JSP指令是给JSP引擎用的,即给服务器用的.作用是告诉服务器,该如何处理JSP中除了指令之外的内容.包括page.include.taglib三种 基本的语法格式:<%@ 指令名称 属性1=& ...

  8. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  9. Java Servlet:服务器小程序

    servlet:服务器小程序 servlet是一个接口,接口是一种规范,因此servlet是一种规范 一个类声明为抽象类的原因: 不包含抽象方法,不想被实例化 包含抽象方法,子类有对抽象方法的不同实现 ...

随机推荐

  1. flask - 1

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, Worl ...

  2. A1

    It’s surprising what you can find at the end of your garden. Wild flowers... and even smaller yet, i ...

  3. C++关于堆的函数

    建立堆 make_heap(_First, _Last, _Comp) 默认是建立最大堆的.对int类型,可以在第三个参数传入greater<int>()得到最小堆.   在堆中添加数据 ...

  4. Action中使用Json

    1.前台页面中的ajax: //根据部门查询该部门下的用户列表 function doSelectDept(){ //1.获取部门 var dept = $("#toCompDept opt ...

  5. 【bzoj2330】[SCOI2011]糖果 差分约束系统

    题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...

  6. arc073 F many moves(dp + 线段树)

    设dp[i][y]表示一个点在x[i],另一个点在y时最小要走的步数 那么有以下转移 对于y != x[i-1]的状态,可以证明,他们直接加|x[i] - x[i-1]|即可(如果有其他方案,不符合对 ...

  7. win8.1 host被删,host无法修改,host无法复制进去解决方案

    1.C:\Windows\System32\drivers\etc\hosts  复制到桌面 2.删除C:\Windows\System32\drivers\etc\hosts 3.右键编辑文本--& ...

  8. 【题解】Bzoj4316小C的独立集

    决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...

  9. [洛谷P3690]【模板】Link Cut Tree (动态树)

    题目大意:给定$n$个点以及每个点的权值,要你处理接下来的$m$个操作.操作有$4$种.操作从$0到3编号.点从1到n编号. $0,x,y$:代表询问从$x$到$y$的路径上的点的权值的$xor$和. ...

  10. linux管理(二)---网络使用情况的监控

    我们经常在监控服务器或者排查程序性能瓶颈时需要知道  网络带宽的使用情况,看看带宽是不是瓶颈. linux系统中监控网络的工具和命令很多. 但其实主要分2种,一种是实时监控带宽情况(速度如何),一种是 ...