• servlet(4)


    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	omcat6webapps	estServletindex.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




  • 相关阅读:
    Python中的赋值(复制)、浅拷贝与深拷贝
    review
    Python网络编程
    云计算网络 ASW DSW CSW LSW
    Python文件操作 I/O
    RSI 指标
    python 常见模块
    Python模块和包
    读利弗莫尔
    GDP、CPI、M2
  • 原文地址:https://www.cnblogs.com/oldinaction/p/5167483.html
Copyright © 2020-2023  润新知