Servlet入门(二),超级详细!!!看完就会!!!!
上一篇的内容见:
四.Servlet入门
2.标准Java Web工程结构
这些都不用我们自己来手动创建,只要使用eclipse创建标准的java工程,eclipse就会自动帮我们创建好了.
webapps:web应用程序发布的目录
web应用目录:一般是工程的名字,里面是WEB-INF和METE-INF文件夹
index.html或index.jsp:默认首页.创建在WebContent目录下.
工程目录中也多了index.html
eclipse会将我们自己工程中创建的文件自动的和Tomcat发布的目录进行同步
我们可以在index.html中编写内容
这时通过网址:localhost:8080/FirstServlet/
显示的就是我们的默认首页index.html
WEB-INF:用于存放配置文件以及相关的类,jar包等
3.Servlet开发与基本配置
1)Servlet开发步骤
Step1.创建Servlet类,继承HttpServlet
Step2.重写service方法,编写程序代码
Step3.配置web.xml,绑定URL
4.请求参数的发送与接收
什么是请求参数?
-请求参数是浏览器通过请求向tomcat提交的数据
-请求参数通常是用户输入的数据,待Servlet进行处理
请求参数的格式
请求参数一次可以传递多组数据,每组数组采用键值对的方式出现,多组数据之间采用&连接:
参数名1=参数值1&参数名2=参数值2&参数名3=参数值3....
在准备好的带有表单的页面中,在表单form标签中添加action属性,属性值一般就是访问servlet的完整地址.
实际开发过程中属性值url中的http://localhost:8080可以省略,直接写/工程名/url-pattern即可.
在浏览器中输入:localhost:8080/FirstServlet/Student.html
(ip地址:端口号/工程名/页面名)
可以看到之前准备好的表单页面,在表单中填好相应信息后,点击提交.
会跳转到servlet设置好的页面上,同时,地址栏中的url后面会看到请求参数的信息.
接收请求参数
5.Get与Post请求
它们的目标都是将我们的请求发送并且被Servlet处理 .
在我们的表单发送的时候,默认都是用get方法.
如果要更改,需要在form表单上添加method属性.
使用post时,点击提交表单后,跳转的地址后面的参数就都没有了.
那我们要在哪里才能看到参数呢?
在浏览器中按F12,打开控制台页面,进入network,刷新,就可以看到当前页面的地址
点击Form Data旁边的 view source,可以看到post发送数据的格式和get是一样的,只是发送的方式不同.
get方法,除了能在地址栏中看到参数外,也可以在控制台中的Query String Parameters中看到
service是请求处理的核心方法,无论是get还是post请求都会被service()方法处理.
通过request.getMethod()方法可以获得现在使用的是哪中请求方法,得到的内容是GET或POST
但是,在实际的开发工作中,因为get和post的处理逻辑是不同的,我们要将它们分开处理.
这时service方法的权利就有点过大了,因为所有的请求都会被service接收到.
因此.sevelet专门针对get和post 提供了相应的处理方法doGet()和doPost()
除了方法名不同外,其他全部与service方法一致.
service就相当于一个分拣员,得到请求后,判断是采用哪种请求方法,如果是get方法就交给给doGet()处理.如果是post方法,就交给doPost()处理.
get与post的应用场景
6.Servlet生命周期
1 装载 - web.xml(Tomcat解析web.xml,知道servlet的存在)
Tomcat启动时,servlet会扫描我们web应用中的web.xml文件,在web.xml中对servlet进行了声明并且绑定了url.
这时只是解析了web.xml,并没有创建servlet
2 创建 - 构造函数(第一次访问我们的servlet的时候,创建我们的servlet对象,并执行它的构造函数)
在我们第一次访问servlet所绑定的url的时候,Tomcat会创建我们的servlet类对象(只是单纯的new),默认的执行构造函数
3 初始化 - init() 调用init方法进行初始化
Servlet会执行它自己带的init()方法来将我们的servlet初始化.之后servlet就创建成功了
4 提供服务 - service()
我们之后再访问servlet的时候,servlet会通过service或者是doGet,doPost方法来为我们提供服务
5 销毁 - destroy()
如果我们的Tomcat重启或关闭了,servlet会自动执行destroy()销毁方法
==============================================================================================================
我们可以在我们的servlet代码中增加构造方法,以及重写init和destroy方法
重写init:source→Override/Implement Methods...→选择GenericServlet类里的init(Config)方法
重写destroy:source→Override/Implement Methods...→选择GenericServlet类里的destroy()方法
我们启动Tomcat.但是,此时发现控制台并没有任何的输出,这时因为servlet是在第一次被访问的时候才会进行创建和初始化.
在启动时,它其实只是在web.xml文件中进行了解析,Tomcat在这个时候是知道有这个servlet存在的,但不会对它进行任何初始化工作
在我们通过浏览器访问servlet之后,可以看到控制台这时输出了相应的内容
当我们再次访问servlet的时候,只是进行了service方法进行了相应的输出,并没有再创建对象和初始化
通过这个例子,我们可以看出 在Tomcat的全局中有且只有一个servlet对象,当这个servlet对象在第一次访问servlet时被创建以后,
之后的所有请求都会被这一个servlet对象所处理.
当我们的代码被修改并保存的时候,可以看到控制台打印servlet正在销毁,这是因为保存的时候,会重启Tomcat,自动执行destroy方法
当我们重启后,再访问servlet,可以看到,此时对象又被重新创建并初始化提供服务了.这整个过程就是servlet的完整生命周期.
7.注解配置Servlet
在之前的学习中,我们没编写一个servlet文件都要在web.xml中进行配置.虽然这是必经的过程,但是这样在开发过程中比较麻烦.
在jdk1.5以后推出了一个全新的技术.当当~它就是---- 注解!
注解用于简化web应用程序的开发和配置.
在servlet 3.X 以后也引入了 "注解Annotation"特性
Servlet有且只有一个核心注解:@WebServlet
当我们把@WebServlet写到代码中,就起到了对Servlet文件进行配置的作用,从而避免在web.xml中多次书写Servlet相关配置
=============================================================================================
使用方式也很简单,只要在我们的Servlet类上,写上@WebServlet,并导入对应的包,在@WebServlet中写好相应的参数
这里面写的地址就是之前我们写在web.xml文件的servlet映射中的url地址.
在web应用启动时,Tomcat会扫描当前所有的字节码文件(.class),看到这个servlet类上写了@WebServlet并且配置了对应的url,就把这个规则加载进来,
即便没有在web.xml中进行配置也没有关系,因为通过注解也可以知道映射所在url,所以WebServlet就像一个标志一样,它告诉Tomcat我们当前的类就是一个servlet,
把它绑定到/anno上就可以了.
下面我们来验证一下.
启动Tomcat,打开浏览器,访问localhost:8080/FirstServlet/anno
可以看到内容显示出来了,但是中文部分变成了问号.
在代码中添加一句设置字符编码的就可以解决这一问题了.但要注意设置编码这一句要写到输出语句的上面.否则无效.
8.启动时加载Servlet
web.xml使用<load-on-startup>设置启动加载
<load-on-startup>0~9999<load-on-startup>
推荐范围是0~9999,其中0优先级最高,如果在当前的系统中有多个Servlet都要启动时加载,0就是最先被执行的
启动时加载在工作中常用于系统的预处理,把这些费时费力的工作放到系统启动时来进行,这样用户在访问Servlet的时候就会快很多
我们在工程中理解一下这个问题:
Step1 首先创建一个工程job-servlet,在工程目录的src目录中创建一个类CreateServlet
场景是:现在我们开发一个系统,在系统启动的时候要自动完成初始化数据库,导入数据以及统计分析这三个工作
这里的CreateServlet负责创建数据库,现在我们希望在程序启动的时候让这个Servlet自动的完成这个工作.
点击source→override/implement Methods→选择GenericServlet这个类里的init(),来重写init()方法
在Tomcat启动时,如果我们设置了启动时加载,它就会自动运行init方法中编写的代码.
然后在web.xml中配置Servlet的自动启动
配置好后,将这个工程发布到Tomcat,启动Tomcat,可以看到控制台中"正在创建数据库"已经被打印出来
Step2 再创建一个类ImportServlet
场景是:用于在数据库创建成功后,对数据进行自动导入.
点击source→override/implement Methods→选择GenericServlet这个类里的init(),来重写init()方法
然后在web.xml中配置这个Servlet的自动启动,并把load-on-start的数字设置为1,这样就符合了它们的运行顺序
配置好后,启动Tomcat,可以看到控制台中"正在导入数据"已经被打印出来
Step3 再创建一个类AnalysisServlet
场景是:用于导入数据成功后,分析数据.
点击source→override/implement Methods→选择GenericServlet这个类里的init(),来重写init()方法
然后在web.xml中配置这个Servlet的自动启动,并把load-on-start的数字设置为2,这样就符合了它们的运行顺序,依次执行
配置好后,启动Tomcat,可以看到控制台中"正在分析结果"已经被打印出来
这里不像以前一样给servlet绑定url.是因为这些servlet主要是做程序刚开始运行初始化的工作,不需要写service,doGet,doPost这些方法.
也就不需要绑定url.可以将service,doGet,doPost这些方法写在其他的servlet中
除了使用web.xml来配置 load-on-start外,还可以采用注解来配置.
但要注意的是,使用注解的方式配置 load-on-start,需要强制在参数中加上urlPatterns这个参数,这个url地址也许在实际使用过程中不会用到,
但是一定要设置, load-on-start才会生效.
重新启动Tomcat,可以看到生效了
下一篇:JSP入门