博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet(4) - servletAPI - 小易Java笔记
阅读量:5738 次
发布时间:2019-06-18

本文共 8728 字,大约阅读时间需要 29 分钟。

Servlet规范核心类图

1、请求和响应对象

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

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

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

2、HttpServletRequest详解

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

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

==>

==> html或jsp代码:

 

 

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

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

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

==> web.xml的配置:

 

parameter
parameter
com.smalle.servlet.GetParameterServlet
parameter
/parameter

 

==> 在浏览器中输入: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
headNames = req.getHeaderNames();while(headNames.hasMoreElements()){ String name=(String)headNames.nextElement(); //取出信息名 String value = req.getHeader(name); //取出信息值 out.println(name + " = " + value); out.flush(); out.close(); //关闭流}/*取出的信息名结果为hostconnectioncache-controlacceptuser-agentaccept-encodingaccept-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代码	
servletConfig
com.smalle.servlet.ServletConfigServlet
name
小易
age
18
servletConfig
/config
------------------------------------------------------- ==>结果:输入: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代码	
encoding
UTF-8
ServletContext
com.smalle.servlet.ServletContextServlet
ServletContext
/context
------------------------------------------------------- ==>结果:输入: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

转载于:https://www.cnblogs.com/oldinaction/p/5167483.html

你可能感兴趣的文章
43、我的C#学习笔记9
查看>>
字符串的简单操作
查看>>
C#新功能--命名参数与可选参数
查看>>
strtok和strtok_r
查看>>
维辰超市:借助云商城成功转型新零售
查看>>
web.xml中<load-on-start>n</load-on-satrt>作用
查看>>
【算法】CRF
查看>>
windows 8 微软拼音输入法
查看>>
Windows UI风格的设计(7)
查看>>
SQL中使用WITH AS提高性能 使用公用表表达式(CTE)简化嵌套SQL
查看>>
oracle 强行杀掉一个用户连接
查看>>
Git提交本地库代码到远程服务器的操作
查看>>
灾难拯救——让软件项目重回轨道
查看>>
mysql中主外键关系
查看>>
我的友情链接
查看>>
让你快速上手的Glide4.x教程
查看>>
浮动和清除(闭合)浮动
查看>>
微信小程序注册流程
查看>>
LR录制脚本时IE打不开的原因
查看>>
类的基础
查看>>