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