一.ServeltConfig对象

在Servlet的配置文件中,可以使用一个或多个<init-param>标签为Servlet配置一些初始化参数。而不当Servlet配置了初始化参数后,web容器在创建Servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在Servlet的init方法时,将ServleConfig对象传递给Servlet。

在开发程序中,可以通过ServletConfig对象得到当前Servlet初始化的参数信息。

具体方法如下:

在web应用下配置web.xml文件

 <servlet><servlet-name>Demo1</servlet-name><servlet-class>cn.itcast.web.servlet.Demo1</servlet-class><init-param><param-name>encoding</param-name>         <param-value>UTF-8</param-value></init-param><init-param><param-name>driver</param-name>       <param-value>com.mysql.jdbc.Driver</param-value></init-param><init-param><param-name>url</param-name>   <param-value>jdbc:mysql://127.0.0.1:3306/test</param-value></init-param><init-param><param-name>username</param-name>         <param-value>root</param-value></init-param><init-param><param-name>password</param-name>        <param-value>root</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

实现方法:

public void doGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {ServletConfig config = this.getServletConfig();String driver = config.getInitParameter("driver");String url = config.getInitParameter("url");String username = config.getInitParameter("username");String password = config.getInitParameter("password");if(driver!=null && url!=null && username!=null && password!=null){System.out.println("driver="+driver);System.out.println("url="+url);System.out.println("username="+username);System.out.println("password="+password);}}

ServletConfig对象的作用:

1)获取字符集编码(中文)

2)获得数据库连接的信息

3)获取配置文件,查看struts案例的web.xml文件

ServletContext 是配置Servlet环境变量的类。

当工程部署时,就创建了ServletContext对象,同一个工程中的ServletDemo类都共享同一个

二、ServletContext对象

ServletContext对象在web服务器停止或web应用重新部署时,原有的ServletContext对象被销毁。

如何获取ServletContext对象?

1)ServletContext context = this.getServletContext();

2)ServletContext context = this.getServletConfig().getServletContext();

3)ServletContest context = request.getSession().getServletContext();

获取Servlet中的配置参数,则使用到的Servlet对象为ServletConfig

获取WEB应用中的配置参数,则使用到的Servlet对象为ServletContext

在Servlet开发中,需要加载文件,则需要使用SevletContext对象。

代码如下:

Public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//传统方法是基于tomcat/bin/目录下//BufferedReader br = new BufferedReader(new FileReader("src/config.txt"));//System.out.println(br.readLine());//br.close();
ServletContext context = this.getServletContext();InputStream is = context.getResourceAsStream("/config.properties");//斜杠表示当前web应用工程下,即day06工作
Properties props = new Properties();props.load(is);String email = props.getProperty("email");response.getOutputStream().write(email.getBytes());}

扩展知识1

在Servlet开发中,除了使用ServletContext对象加载项目中需要的资源文件外(如.xml文件、.properties文件),还可以通过类加载器加载或读取文件,使用此方法,需要注意以下几个方面:

  1. 代码如下:

    InputStream is = Demo6.class.getClassLoader().getResourceAsStream("config.properties");

    “confing.properites”是类路径,路径与Class.forName("cn.itcast.web.servlet.Demo1")相似,以/分隔。

  1. 有具只能加载类路径下的资源;
  2. 文件位置只能位于类路径下,即IDE工具的src/目录下;
  3. 将整个文件,无论多在,加载到内存;

扩展知识2

关于路径的问题:

  1. 客户端:以浏览器发送请求为基础,例如:<form action=""/>或<a href=""/>或response.sendRedirect("/day06/fail.html");都以/开头,这里/表示"webapps"目录;
  2. 服务端:以服务器内部转发为基本,浏览器不可见。

这里/表示"当前web应用"的目录,即day06。

Servlet开发中转发代码:

//转发到success.html页面

ServletContext context = this.getServletContext();//取得转发对象
RequestDispatcher rd = context.getRequestDispatcher("/success.html");//真实转发
rd.forward(request,response);或者:RequesttDispatcher rd = this.getServletContext.getRequsetDispatcher.forward(request,response);

扩展知识3

  设置缓存问题及乱码问题:

1)浏览器默认有缓存,但缓存内容无期,对于刷新直接向服务端请求资源。

response.setDateHeader("expires",end);

2)高级缓存[304]

3)Servlet开发中,解决中文乱码问题:

使用代码: response.setContentType(“text/html”,”charset=UTF-8”);

或者:response.setHeader(“content-type”,”text/html;charset=UTF-8”);

下载中文名文件,代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext context = this.getServletContext();String path = context.getRealPath("/爱.JPG");File file = new File(path);response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));InputStream is = new FileInputStream(file);OutputStream os = response.getOutputStream();byte[] buf = new byte[1024];int len = 0;while((len=is.read(buf))>0){os.write(buf, 0, len);}is.close();os.close();}

三、 response对象

1)   response向浏览器输出信息,字符方式或字节方式输出问题

要么使用字节方式输出:

response.getOutputStream().write(“你好!”.getBytes) ;

要么使用字符方式输出:

Response.getWriter().write(“你好!”);

2)  对于response输出,内存和响应头一同输出到浏览器

即将response.setContentType(“text/html”,”charset=UTF-8”);设置完成后,会一直在整个的response对象中存在,不需要再设置。

3)      在response对象中,使用到一些流操作的时候,可以不用关闭流,这时web服务器在销毁response之前,会自动将所涉及的流关闭。

例如:PrintWriter pw = response.getWriter();

pw.write(“你好!”);

//  pw.flush();  不需要写这两句

//  pw.close();

四、             request对象

1) request对象主要是获取客户端信息时使用的,例如获取客户端form表单信息、IP地址、主机名、web服务器的IP地址等信息。

如下代码:

String clientIP = request.getRemoteAddr();

String ServiceIP = request.getLocalAddr();

System.out.println(“clientIP=”+clientIP);

System.out.println(“ServiceIP=”+ServiceIP);

2)  request对象可以获取浏览器请求头信息

String accept  = request.getHeader(“accept-encoding”);

String host = request.getHeader(“Host”);

3)  request对象最重要的方法是获取参数信息

例如:获取表单中的参数信息

<form ation=”ServletDemo” method = “post”>

用户名:<input type = “text”  name=”username “/>

密码:  <input type = “text”  name=”password “/>

<input  type = “submit” value = “提交”/>
</form>

代码如下:

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

4)request细节

1)如果在forward()之前已经向浏览器输出内容,并且关闭了流对象此时forword()代码转发到的那个页面的代码不执行

如下代码:

PrintWriter pw = response.getOutputStream();

pw.write("aaa");

pw.flush();//

pw.close();//关闭了流对象

request.getRequestDispach().forward(request,response);

2)如果在forward()之前已经向浏览器输出内容,没有关闭流对象,但是输出到缓存中,此时forward()代码转发到的那个页面代码会执行,原来输出到缓存的代码不执行,即忽略。

3)如果在forward()之后向浏览器输出内容,忽略。

4)如果在forward()之前写的响应头会保留。即只要在Servlet中设置了一处响应头,

如request.setContentType("text/html;charset=utf-8");

在request转发或者转发之后都不需要重新设置

4)使用request对象进行转发

代码如下:

request.getRequestDispatcher(“/success.html”).forward(request,response) ;

//注意:这里的”/”代表day06

5)获取请求参数

//浏览器地址栏只有一个请求参数时,则使用

String username = request.getParameter(“username”);

//浏览器地址栏中有一个请求参数但有多个不同的值时,则使用

String[] liles = request.getParameterValues(“likes”);

For(String like:lies){

System.out.println(like);

}

//浏览器地址栏中有多个请求参数不同值时,则使用

Enumeration enums = request.getParameterNames();

While(enmus.hasMoreElements()){

String key = (String) enums.nextElement();

System.out.println(key);

}

扩展知识:

实现网站中的防盗链问题

五、重定向和转发区别?

1)重定向可以在不同的web应用中导航,但转发仅限于当前web应用中导航。

2)重定向中的/表示webapps目录,即tomcat中web应用的根目录,而转发中的/表示当前的web应用,即day07。

3)重定向地址栏会变化,而转发地址栏不会变化。

4)重定向会通知浏览器,但转发是服务器内部行为,项目中,以减少HTTP请求为原则,尽可能使用转发。

5)重定向不会共享request域对象,但转发可以共享request域对象。

注意:HttpServletRequest有二层含义:

  1. 表示客户端向服务端的请求
  2. 表示request容器/对象/域对象(set/getAttribute())

常用的方法:

Request.getParameter(String str);//请求体的参数信息

Request.getParameterValues(String []);

Request.getParameterNames(Enumeration enums);

Request.getHeader();//请求头中的参数信息

Request.set/getAttribute();//从域对象中设置/获取对应的信息

六、 Request.getRequestDispach(“”).forword(request,response)

与request.getRequestDispach(“”).include(request,response)区别

使用include进入转发时,页面会包含其它的web资源(html/jsp/servlet),include代码转发到的那个页面执行完代码后,会返回到原来包含include代码页面继续执行它下面的代码。而forword()刚好相反。

注意:

Request.getMethod();//获取客户端以什么方式提交(GET/POST方式)

Request.getContextPath();//获取当前web应用名(/day07)

转载于:https://www.cnblogs.com/luihengk/p/3727167.html

理解Servlet及其对象相关推荐

  1. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  2. 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...

    2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...

  3. DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步

    目录 1.前言及本章内容提要 2.初识DirectXMath库 3.使用独立堆创建常量缓冲 4.理解管线状态对象 5.理解围栏同步 6.完整代码 1.前言及本章内容提要 经过了之前3篇教程的跨度有点大 ...

  4. Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

    SpringMVC使用细节 第一节 视图解析器 通过HelloWorld程序我们看到了handler方法的返回值表示: 请求处理完成后,请SpringMVC执行一个请求转发.转发的地址就是handle ...

  5. servlet 理解 --servlet笔记

    http  80 smtp 25 pop3 110 ftp  23 https 443 Host里面 <Context path="/itcast" docBase=&quo ...

  6. 深入理解Servlet

    一.Web服务器 从事web开发的人,会很清楚一个东西叫 Web服务器,比如J2EE开发-Tomcat,Jetty,.NET开发-IIS等.HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏 ...

  7. [Objective-C]哲学大师-通过共性与个性的概念来理解类与对象

    哲学大师-通过共性与个性的概念来理解类与对象 文章目录 哲学大师-通过共性与个性的概念来理解类与对象 如何理解 什么是共性与个性 怎么把理解类与对象 类与对象里面有什么 如何定义 怎么去定义一个类 定 ...

  8. iOS class深入理解: 实例对象、类对象、元类和isa指针

    你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...

  9. 简单的Spring MVC入门程序,对于Spring mvc工作流程的理解,servlet标签和servlet-mapping 理解,视图解析器

    javaweb SpringMvc的组成:jsp,JavaBean,servlet 可以使用Spring所提供的功能 提供了前端控制器DispatcherServlet,不需要细化Servlet 执行 ...

  10. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

最新文章

  1. 分享成为高效程序员的7个重要习惯
  2. eval 与 Function
  3. html整个项目怎么导出来,怎样将jquery导入web项目中?
  4. 程序员的10个谎言,你听过几个?
  5. C++_基础部分_C++文件操作_文件的写入操作---C++语言工作笔记076
  6. opencv新手注意
  7. 今天辞去了联盟的版主职务
  8. Bitwise AND of Numbers Range
  9. samkoon触摸屏用什么软件编程_samdraw3.3软件下载
  10. 什么是句柄/底层绘图函数
  11. 第二章第一题(将摄氏温度转换为华氏温度)(Convert Celsius to Fahrenheit)
  12. php抓取关键词排名,如何 用php抓取google关键词排名?
  13. 以后有面试官问你「密码学」,你就把这篇文章扔给他
  14. python3模拟登录_python3模拟登录有哪些情况
  15. 奇葩Bug频出,苹果AirPods Pro 2提醒用户换电池
  16. swift 图像蒙版,image mask
  17. vscode工作级别认知与配置
  18. Web3世界的入口Wallet使用指南
  19. 实战案例|拒绝信息泄露,腾讯云助力电商对抗网络爬虫
  20. SQLServer学习笔记 --- (20008, 'DB-Lib error message 20008, severity 9:\nUnable to open socket\nNet-Li

热门文章

  1. 上海Android交流会分享主题与报名
  2. ssh java_java中的SSH的各自作用是什么-百度经验
  3. 外星人台式电脑_2020年双11:高端电竞游戏笔记本电脑本推荐:联想、惠普、雷神、ROG、外星人等品牌游戏本挑选指南...
  4. zabbix监控之邮件报警通知
  5. LeetCode 25 Reverse Nodes in k-Group
  6. unity shader base pass and additional pass
  7. 【MySQL笔记】: unable to connect to remote host. catalog download has failed.
  8. ubuntu 12.04 server + OPENACS(TR069)安装配置日记
  9. Android webView嵌套h5页面 软键盘遮盖页面问题 解决方案 java kotlin
  10. 【转载】在windows上部署使用Redis