servlet(4) - servletAPI - 小易Java笔记

来源:互联网 发布:好的视频剪辑软件 编辑:程序博客网 时间:2024/05/17 11:05

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(); //关闭流}/*取出的信息名结果为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代码<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




0 0
原创粉丝点击