servlet学习笔记(一)
Servlet 本身不能独立运行,需要在一个web应用中运行的
而一个web应用是部署在tomcat中的
所以开发一个servlet需要如下几个步骤
创建web应用项目
编写servlet代码
部署到tomcat中
我先使用最原始的方式创建了一个demo:
获取浏览器提交的参数:可以建一个html文件,在其中加入form表单。
因为浏览器中的form的method是post,所以LoginServlet需要提供一个doPost方法。
返回HTML响应给浏览器:通过response.getWriter().println() 发送到浏览器。
调用流程
使用浏览器提交用户名密码的例子来讲述:
1.首先访问http://127.0.0.1/login.html,打开一个静态的html页面,在这个页面中可以通过form,以post的形式提交数据
2.在上一步的login.html中,用form,把账号和密码,提交到/login这个路径,并且附带method="post"
3.tomcat接受到一个新的请求:http://127.0.0.1/login,其路径是/login,接着就到配置文件web.xml进行匹配,发现/login,对应的Servlet类是 LoginServlet。
接下来的工作,就会基于这个LoginServlet进行。
4.Tomcat 定位到了LoginServlet后,发现并没有LoginServlet的实例存在,于是就调用LoginServlet的public无参的构造方法LoginServlet()实例化一个LoginServlet对象以备后续使用
5.Tomcat从上一步拿到了LoginServlet的实例之后,根据页面login.html提交信息的时候带的method="post",去调用对应的doPost方法。
6.接着流程进入了doPost方法中,在这个方法中,通过参数request,把页面上传递来的账号和密码信息取出来:
String name = request.getParameter("name");
String password = request.getParameter("password");
7.接着,根据账号和密码是否正确, 创建不同的html字符串。
然后把html字符串通过如下方式,设置在了response对象上。
PrintWriter pw = response.getWriter();
pw.println(html);
到这里,Servlet的工作就做完了。
8.在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response生成html 字符串,然后再通过HTTP协议,这个html字符串,回发给浏览器,浏览器再根据HTTP协议获取这个html字符串,并渲染在界面上。
这样在效果上,浏览器就可以看到Servlet中生成的字符串了。
DOGET方法 DOPOST方法 SERVICE方法
Servlet 需要提供对应的doGet() 与 doPost()方法。
当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法。
当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法。
LoginServlet继承了HttpServlet,同时也继承了一个方法 :service(HttpServletRequest , HttpServletResponse )
实际上,在执行doGet()或者doPost()之前,都会先执行service()
由service()方法进行判断,到底该调用doGet()还是doPost()
可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。
所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果
注:get方式:
form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
post方式:
在form上显示设置 method="post"的时候
ajax指定post方式的时候
中文问题
为了成功获取中文参数,需要做如下操作
1. login.html中加上 :<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2. login.html form的method修改为post
3. 在servlet进行解码和编码:
byte[] bytes= name.getBytes("ISO-8859-1");
name = new String(bytes,"UTF-8");
返回中文:
在Servlet中,加上:response.setContentType("text/html; charset=UTF-8");
声明周期
一个Servlet的生命周期由 实例化,初始化,提供服务,销毁,被回收 几个步骤组成。
进行服务端跳转和客户端跳转
页面跳转是开发一个web应用经常会发生的事情。
比如登录成功或是失败后,分别会跳转到不同的页面。
跳转的方式有两种,服务端跳转和客户端跳转。
在Servlet中进行服务端跳转的方式:request.getRequestDispatcher("success.html").forward(request, response);
在Servlet中进行客户端跳转的方式:response.sendRedirect("fail.html");
自启动
有的时候会有这样的业务需求:
tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现自启动 即,伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了。
在web.xml中,配置Hello Servlet的地方,增加一句<load-on-startup>10</load-on-startup>,取值范围是1-99,即表明该Servlet会随着Tomcat的启动而初始化。
request的常见方法
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
request.getHeader() 获取浏览器传递过来的头信息。
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息
setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享
RESPONSE常见用法
通过response设置响应已经用得比较多了,在前面的Servlet学习中都是用到
PrintWriter pw= response.getWriter();
通过response.getWriter(); 获取一个PrintWriter 对象
可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。
设置响应格式:response.setContentType("text/html");
设置响应编码:
1. response.setContentType("text/html; charset=UTF-8");
2. response.setCharacterEncoding("UTF-8");