一、开发Servlet
Servlet 本身不能独立运行,需要在一个web应用中运行的
而一个web应用是部署在tomcat中的
所以开发一个servlet需要如下几个步骤
创建web应用项目
编写servlet代码
部署到tomcat中
开发的IDE也有各种选择,有的使用MyEclipse,有的使用eclipse 的EE版本,有的使用IDEA开发。
本例使用Eclipse EE版 结合独立的 tomcat进行一次java普通项目的创建。
这样做的好处是,通过最原始的方式创建一个web应用,可以掌握最基本的知识。
必读: 基于Tomcat的程序要成功运行,对于配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致运行失败。 如果你是第一次学习本教程,务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍
指定项目输出到classes目录
首先在WEB-INF下创建classes目录
把项目的class文件输出由原来的 j2ee/bin 设置到 j2ee/web/WEB-INF/classes下
步骤:
项目右键->properties->Java Build Path->Source->右下角的 Brower-> 指定位置是 j2ee/web/WEB-INF/classes。
为什么要有这一步? 在ecilpse中默认输出的class是在bin目录下,但是tomcat启动之后,在默认情况下,不会去bin目录找这些class文件,而是到WEB-INF/classes这个目录下去寻找。 所以通过这一步的配置,使得eclipse的class文件输出到WEB-INF/classes目录下,那么这样就和tomcat兼容了。
SERVLET 基础 调用流程
首先访问html文件,不加html是不行滴,那就变成直接访问
有.html后缀请求的就是硬盘上的静态文件, 不带后缀请求的就是Servlet, 这时才会创建相应的servlet对象(如果是第一次请求此servlet的话)
打开一个静态的html页面,在这个页面中可以通过form,以post的形式提交数据
2./login路径
在上一步的login.html中,用form,把账号和密码,提交到/login这个路径,并且附带method=”post”
3.找到对应的Servlet
tomcat接受到一个新的请求:
其路径是/login,接着就到配置文件web.xml进行匹配,发现/login,对应的Servlet类是 LoginServlet。
接下来的工作,就会基于这个LoginServlet进行。
4.实例化Servlet对象
Tomcat 定位到了LoginServlet后,发现并没有LoginServlet的实例存在,于是就调用LoginServlet的public无参的构造方法LoginServlet()实例化一个LoginServlet对象以备后续使用
5.调用doGet或者doPost
Tomcat从上一步拿到了LoginServlet的实例之后,根据页面login.html提交信息的时候带的method=”post”,去调用对应的doPost方法。
6.request获取参数
接着流程进入了doPost方法中,
protected void doPost(HttpServletRequest request, HttpServletResponse response){
...
}
在这个方法中,通过参数request,把页面上传递来的账号和密码信息取出来
String name = request.getParameter("name");
String password = request.getParameter("password");
7.response设置响应
接着,根据账号和密码是否正确(判断是否是admin和123), 创建不同的html字符串。
然后把html字符串通过如下方式,设置在了response对象上。
意味着response对象上有个输出流?
PrintWriter pw = response.getWriter();
pw.println(html);
到这里,Servlet的工作就做完了。
8.tomcat把html传递给浏览器
在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response 生成html 字符串,然后再通过HTTP协议,这个html字符串,回发给浏览器,浏览器再根据HTTP协议获取这个html字符串,并渲染在界面上。
这样在效果上,浏览器就可以看到Servlet中生成的字符串了。
二、DOGET方法 DOPOST方法 SERVICE方法
doGet()
当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
哪些是get方式呢?
form**默认**的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
doPost()
当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法
哪些是post方式呢?
在form上显示设置 method=”post”的时候
ajax指定post方式的时候
service()
LoginServlet继承了HttpServlet,同时也继承了一个方法
service(HttpServletRequest , HttpServletResponse )
实际上,在执行doGet()或者doPost()之前,都会先执行service()
由service()方法进行判断,到底该调用doGet()还是doPost()
可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。
所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果
三、中文问题
获取中文的参数
为了成功获取中文参数,需要做如下操作
1. login.html中加上
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码
login.html
form的method修改为post在servlet进行解码和编码
byte[] bytes= name.getBytes(“ISO-8859-1”);
name = new String(bytes,”UTF-8”);
先根据ISO-8859-1解码,然后用UTF-8编码
这样就可以得到正确的中文参数了
这样需要对每一个提交的数据都进行编码和解码处理,如果觉得麻烦,也可以使用一句话代替:
request.setCharacterEncoding("UTF-8");