index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发

JavaWeb基础与应用

2.Servlet开发

  • Servlet是sun公司提供的一门用于开发动态web资源的技术。
  • Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
  • 编写一个Java类,实现servlet接口。
  • 把开发好的Java类部署到web服务器中。
  • 快速入门,用servlet向浏览器输出“hello servlet”。
  • 阅读Servlet API,解决两个问题:
  • 输出hello servlet的java代码应该写在servlet的哪个方法内?
  • 如何向IE浏览器输出数据?

Web的目录结构

v2-65f109483aeba59032949dd23a71e98c_b.jpg

Servlet入门基础

方式1:使用配置文件的方式配置servlet

编写一个类继承HttpServlet:重写一个方法service方法

在web.xml配置这个Servlet :配置 <servlet></servlet>、<servlet-mapping></servletmapping>

web.xml中配置:

v2-e1a78319360f3605ea744646e5236b2d_b.jpg
/**

方式2:使用注解的方式配置servlet

/**

Servlet的运行流程

@WebServlet

Servlet的生命周期

笔面试题:请描述servlet的生命周期

Servlet的生命周期和工作原理

Servlet的的声明周期分为三个阶段:1.初始化阶段 2.响应客户阶段 3.终止阶段

这三个阶段分别对应init方法 service方法 和destory方法,这三个方法分别在不同的阶段进行调用。

1)Servlet的初始化阶段

在以下时刻servlet进行初始化 servlet初始化包含以下三种情况,这三种情况都会执行init方法

a.servlet容器启动后,自动加载某些配置信息。需要配置<load-on-startup></load-on-startup>

v2-9dbc236da7944fbb4b024c80c0e41975_b.jpg

b.在servlet容器启动后,客户端第一次向servlet发起请求

c.servlet的文件被更改后 重新加载servlet

注意: init方法只会在第一次初始化servlet的时候执行。

2)servlet响应客户端阶段

Servlet当接受到客户端请求后,servlet会根据这个请求创建两个对象HttpServletRequest对象和HttpServletResponse对象,这个对象分别代表接受请求和响应请求,然后servlet调用service方法。Service方法会根据HttpRequest对象从请求中获取相关的数据,然后处理请求,最后通过HttpResponse对象把数据写出到客户端。

3)servlet终止阶段

  • 当web应用被终止,或者servlet容器终止运行
  • 或servlet容器被重新加载
  • 当前终止的时候回调用destroy方法进行终止。
@WebServlet

Servlet相关的对象

说明:为了美化测试界面,下述测试案例大部分使用BootStrap框架,需要导入相关的css、js、font文件

<1>ServletConfig对象

  • 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
  • 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
  • 阅读ServletConfig API,并举例说明该对象的作用:
    • 获得字符集编码
    • 获得数据库连接信息
    • 获得配置文件,查看struts案例的web.xml文件

web.xml配置的参数:可以通过ServletConfig对象获取

v2-7af9fc8ddbf7ecd4707079b47edae3bd_b.jpg
/**

<2>ServletContext

  • WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
  • ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
  • 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象
  • 查看ServletContext API文档,了解ServletContext对象的功能。

案例1:多个servlet共享数据

/**

运行结果:先执行ServletContextDemo1再执行ServletContextDemo2方能获取数据

案例2:获取全局的web初始化参数

web.xml中配置:

v2-1f41d28436c5514c418047b3fa7867ee_b.jpg
/**

案例3:实现servlet之间的转发

/**

结果分析:执行ServletContextDemo4发现页面执行ServletContextDemo5的页面内容,但地址栏不发生变化

v2-db17ddc8a8fe5721efe0cd4929845dbe_b.jpg

案例4:读取资源文件

/**

v2-51cd5bcb7e7f08148c41180b07a03099_b.jpg

Request对象和Response对象

  • Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
  • request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

<1>HttpServletResponse对象

response细节问题:

  • getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
  • getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
  • Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  • Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

案例1:通过response对象输出中文到客户端

代码分析:

/**

结果展示:

http://localhost:8080/JavaWeb/ResponseDemo1

v2-24c713de24ef272406ff298de05ab40d_b.jpg

案例2:通过response对象输完成文件的下载

代码分析:

/**

结果展示:

v2-9a3dfef5c6c9fcb11410366f419200e2_b.jpg

v2-ab7aa89f55a8095e5f1c566ca4e4430f_b.jpg

案例3:通过response对象生成随机图片(验证码)

代码分析:

ResponseDemo3.java:

/**

identify.html:测试页面

<!DOCTYPE html>

结果展示:

http://localhost:8080/JavaWeb/ResponseDemo3

v2-1cf5ee12adc131ca4b2c3234c666ba66_b.jpg

http://localhost:8080/JavaWeb/html/identify.html

v2-86a626d8b678e0b3673f6d08af7975fa_b.jpg

<2>HttpServletRequest对象

案例1:通过request对象常用的方法

代码展示:

/**

结果展示:

http://localhost:8080/JavaWeb/RequestDemo1

v2-3bb8f071e2822e678e7dfa4bb0d07a45_b.jpg

:

案例2:获取表单的各项输入的数据

代码展示:

RequestDemo2.java:

/**

userRegister.html:用户注册测试界面

<!DOCTYPE html>

userRegister.js:初始化年月日下拉列表

function 

结果展示:

http://localhost:8080/JavaWeb/RequestDemo2

如果是直接访问RequestDemo2则没有获取表单提交的数据,显示为null,如果是通过指定的html提交指定的表单数据则正常回显信息

http://localhost:8080/JavaWeb/html/userRegister.html

v2-630c844ef80193e6d8004bea9ce6a9e2_b.jpg

v2-e295795dd425beadb6675156afca3157_b.jpg

v2-81262c963f1aa08f8fd751becbd1e8be_b.jpg

案例3:通过request请求参数中文乱码问题

代码分析:

RequestDemo3.java

/**

code.html:测试界面

<!DOCTYPE html>

结果显示:

http://localhost:8080/JavaWeb/html/code.html

v2-c39438f8ba01e0aa15816f22fb640c6b_b.jpg

v2-07af794e9095fb088dc495ab1655589a_b.jpg

笔面试题:平时如何解决项目中乱码

1、如果是提交方式是post 如果不想乱码,只需要设置request.setCharacterEncoding("UTF-8"); 和页面的编码集一致 <meta charset="UTF-8">

2、如果提交表单的方式是get,设置request是无效的,如果想获取的参数显示不是乱码,需要重新封装获取的数据再进行输出,参考示例如下:

String username=request.getParameter("username");

username=new String(username.getBytes("ISO-8859-1"),"UTF-8");

System.out.println(username);

3、get方式乱码,还可以通过设置服务器的配置实现,可以在tomcat安装目录下更改conf/server.xml

v2-751e8edb847ab58638529e57cdf042bb_b.jpg

<3>请求转发和重定向

  • 一个web资源接收到客户端请求后,通知浏览器去调用另外一个web资源进行处理,称之为请求转发
  • 一个web资源接收到客户端请求后,通知浏览器去访问另外一个web资源,称之请求重定向

v2-fe469bcae924c6a8b1254f06a72500a6_b.jpg

代码展示:

/**

结果展示:

a.重定向测试:地址栏发生变化,页面跳转到指定的页面资源

http://localhost:8080/JavaWeb/RequestDemo4

http://localhost:8080/JavaWeb/html/userRegister.html

b.请求转发测试:

地址栏不会发生变化,页面显示指定的页面资源,此处显示css样式失效是由于在指定的html测试文件中的路径设置参考的是当前地址,因此无法准确定位到相应的bootstrap提供的样式,可以明确用${pageContext.request.contextPath}表示当前工程目录即可

http://localhost:8080/JavaWeb/RequestDemo4

v2-50ef7accb99620e008580da341424b36_b.jpg

笔面试题:请求转发和重定向有什么区别?

  • RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 (范围的不同)
  • 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。 (“/”的含义)
  • 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。(URL地址是否变化)
  • HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。 (请求次数和响应次数)
  • RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令之stty

用途说明 stty命令用于显示和修改终端行设置&#xff08;change and print terminal line settings&#xff09;。 常用参数 stty命令不带参数可以打印终端行设置&#xff0c;加上-a参数可以打印得更详细些。 stty size可以显示终端的大小&#xff0c;即行数和列数。 stty命令还…

本机速度文件支持的“纯” Java大数据存储

动机 所有这一切始于意识到我买不起足够大的计算机。 音频处理需要大量的内存。 Audacity是一款出色的免费音频处理器&#xff0c;它使用文件支持的存储系统对其进行管理。 这是解决此类问题的常用方法&#xff0c;在这些问题中&#xff0c;我们存储了大量信息&#xff0c;并希…

element ui后台html_GitHub上10个开源且优秀的后台管理系统UI面板

作者&#xff1a;SevDotwww.jianshu.com/p/3bc7404af887Web 开发中几乎的平台都需要一个后台管理&#xff0c;但是从零开发一套后台控制面板并不容易&#xff0c;幸运的是有很多开源免费的后台控制面板可以给开发者使用&#xff0c;那么有哪些优秀的开源免费的控制面板呢&#…

mysql 唯一记录_mysql选择唯一记录

我有以下查询&#xff1a;select * from members,subscriptionswhere members.MemberID subscriptions.MemberIDand subscriptions.Year 2009and members.ASSCID 15and subscriptions.Untildate between $2009-01-01 and 2009-12-31order by members.Memberlastname会员支付…

JAVA第七次作业

《Java技术》第七次作业 &#xff08;一&#xff09;学习总结 1.写出事件处理模型中的几个关键词&#xff0c;并通过具体代码实例说明你对事件处理模型的理解。 WindowListener&#xff1a;窗体事件&#xff0c;专门处理窗体的事件监听口&#xff0c;窗体的所有变化都可以使用此…

java时间格式转js_使用jquery或java脚本将日期时间转换为rfc3339格式

您的要求似乎微不足道&#xff0c;还有更多吗&#xff1f;这是显而易见的答案&#xff1a;function formatTimestring(s) {var b s.split(/[\\/:]/);return b[2] b[1] b[0] \T\ b[3] b[4] \00\ \Z\}alert(formatTimestring(\08/09/2010:12:00\) //20100908T120000Z);如…

输出以下图案菱形7行_春夏格子图案超流行,三木的一款格子连衣裙,带来田园少女风...

春夏搭配中&#xff0c;增添了华丽格子图案搭配&#xff0c;从经典的格子裙子&#xff0c;到衬衫裙等。根据搭配不同而成为不同风格。所以&#xff0c;这一次&#xff0c;重点介绍格子裙和长衬衫的几种种搭配。格子裙子的春夏搭配推荐LOOK&#xff1a;1 [格子褶皱裙子棕色T恤]的…

asp.net FileUpload上传文件夹并检测所有子文件

1.在FileUpload控件添加一个属性 webkitdirectory""就可以上传文件夹了 <asp:FileUpload ID"FileUpload1" runat"server" webkitdirectory"" />2.检测文件夹下所有子文件 string DirectoryName FileUpload1.PostedFile.FileNam…

使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

几周前&#xff0c;我写了关于在Java 9上运行Eclipse Neon的文章 &#xff08;尽管&#xff0c;我在帖子标题中错误地和令人尴尬地留下了“火星”&#xff09;。 值得注意的是&#xff0c;我列出的步骤也适用于带有Project Jigsaw &#xff08;Java模块化&#xff09;构建的JDK…

火狐配置java_java selenium+firefox环境搭建

已经成功搭建的版本关系&#xff1a;FireFox45selenium3.141.59 geckodriver 0.21.0启动浏览器后空白页&#xff1a;浏览器版本太高Firefox历史版本geckodriver驱动版本https://github.com/mozilla/geckodriver/releasesselenium maven地址org.seleniumhq.seleniumselenium-ja…

arduino蜂鸣器_板卡推荐BPIUNO32 arduino 开发板,支持webduino与arduino应用

BPI:UNO32(也称为BPI-UNO32&#xff0c;被称为BPI UNO32)是一个带有Xtensa 32位LX6的单/双核心处理器的嵌入式系统的ESP32。支持Webduino和arduino的功能。BPI-UNO32使用的是esp-WROOM32&#xff0c;MCU。ESP32是一种集成2.4 GHz Wi-Fi和蓝牙双模式的单芯片解决方案。该公司的4…

Perl sendmail

introduction of sendmailexamplesend mail to multi-receiver转载于:https://www.cnblogs.com/david-wei0810/p/6846515.html

java 7.0 特性_JDK7.0语法新特性

JDK7.0语法新特性1&#xff0c;菱形语法(泛型实例化类型自动推断)List list new ArrayList<>(); // <>这个真的很像菱形2&#xff0c;在目前版本中&#xff0c;不可具体化的泛型(任意类型)可变参数&#xff0c;在编译时&#xff0c;会在调用处产生警告&#xff0c…

Unity优化之GC——合理优化Unity的GC (难度3 推荐5)

原文链接&#xff1a;http://www.cnblogs.com/zblade/p/6445578.html 最近有点繁忙&#xff0c;白天干活晚上抽空写点翻译&#xff0c;还要运动&#xff0c;所以翻译工作进行的有点缓慢 。 本文续接前面的unity的渲染优化&#xff0c;进一步翻译Unity中的GC优化&#xff0c;英文…

centos重置系统_双系统下Linux系统无法启动及其引导丢失之解决

背景介绍: 很久很久以前, 我在 NewSurfacePro(SP5) 里插了一张 128G 内存卡, 费力九牛二虎之力在上面装了 Deepin, 后来在某次不知道是 Windows 还是 Deepin 更新后, Deepin 启动时总要发生一个极具 Linux 特色的启动错误, witch 似乎在我树莓派上出现过, 折腾了很久也没好, 就…

Java 7和Java 8之间的细微自动关闭合同更改

Java 7的try-with-resources语句和与该语句一起使用的AutoCloseable类型的一个不错的功能是&#xff0c;静态代码分析工具可以检测到资源泄漏。 例如&#xff0c;Eclipse&#xff1a; 具有以上配置并尝试运行以下程序时&#xff0c;您将收到三个警告&#xff1a; public stat…

reduce python3_更少循环?看看这3个Python函数

原标题&#xff1a;更少循环&#xff1f;看看这3个Python函数 全文共1146字&#xff0c;预计学习时长5分钟图源&#xff1a;wired 诞生于1991年的Python&#xff0c;这几年突然火了。简历上有了Python&#xff0c;就业竞争力瞬间提升&#xff0c;甚至一些小学教材上都出现了Pyt…

java list compareto_Java,如何使用compareTo对Arraylist进行排序

我试图弄清楚如何使用可比较的方式对ArrayList进行排序,我的代码如下所示&#xff1a;public class playerComparsion{public static void main(String[] args){ArrayList list new ArrayList();Player p1 new Players(1,92,Zlatan);Player p2 new Players(2,92,Hazard);Pla…

java图片上传(mvc)

最近有开始学起了java,好久没写文章了,好久没来博客园了。最近看了看博客园上次写的图片上传有很多人看&#xff0c;今天在一些篇关于java图片上传的。后台接收用的是mvc。不墨迹了&#xff0c;直接上图。 先看目录结构。idea开发。 一、图片上传还是使用的这款jq插件。前端部署…

appengine_Google AppEngine:任务队列API

appengine任务队列 com.google.appengine.api.taskqueue 使用任务队列&#xff0c;用户可以发起一个请求&#xff0c;以使应用程序执行此请求之外的工作。 它们是进行后台工作的强大工具。 此外&#xff0c;您可以将工作组织成小的离散单元&#xff08;任务&#xff09;。 然后…