servlet
2018-04-24 本文已影响0人
ticktackdong
开发Servlet
Servlet本身不能独立运行,需要在一个web应用中运行,一个web应用是部署在tomcat中的
所以开发一个servlet需要如下几个步骤
1.创建web应用项目
创建一个java project,导入servlet-api.jar
2.编写servlet代码
public class HelloServlet extends HttpServlet{
doGet();//在浏览器输入地址提交数据的方式是GET
}
3.部署到tomcat中
1. 配置web.xml(web/WEB-INF/web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>//两处的name必须一样
<servlet-class>HelloServlet</servlet-class>//name与class可以不一样,一般写成一样
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>//两处的name必须一样
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
2.指定输出目录到classes目录(WEB-INF/classes)
3.配置tomcat的server.xml 中的<context
获取参数
1.创建login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="login" method="post">
//会提价到login路径(映射到LoginServlet)
账号: <input type="text" name="name"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
</body>
</html>
2.创建LoginServlet,提供doPost(),在方法中通过request.getParamter根据name取出对应的账号密码
3.映射LoginServlet到路径login
返回响应
LoginServlet判断账号密码是否正确,
正确打印success否则打印fail。
创建相应的html字符串通过
response.getWriter.println()发送到浏览器
调用流程
调用流程.png1.首先访问login.html打开一个静态html页面在这个页面中可以通过form以post形式提交数据
http://127.0.0.1/login.html
2.form把账号和密码提交到/login路径并附带method="post"
3.tomcat接收到一个新请求http://127.0.0.1/login
通过web.xml映射到LoginServlet
4.Tomcat定位到LoginServlet后发现没有LoginServlet实例存在于是就调用LoginServlet的public无参的构造方法实例化一个对象
5.Tomcat拿到LoginServlet实例后根据login.html提交的method="post"去调用doPost方法
6.在doPost方法中通过调用参数request.getParameter()把页面上传递过来的账号和密码信息取出来
7.根据账号密码是否正确创建不同的html字符串并设置在response对象上
PrintWriter pw = response.getWriter();
pw.println(html);
8.tomcat把html传递给浏览器(HTTP协议)
service()/doGet()/doPost()
doGet()
当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
get方式:
form默认提交方式
通过超链访问某个地址
在地址栏输入某个地址
ajax指定使用get方式的时候
doPost()
当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法
post方式:
form显示设置method="post"时
ajax指定使用get方式的时候
service()
实际上在执行doGet/doPost之前都会先执行service(HttpServletRequest , HttpServletResponse ),由service判断调用get还是post
service(), doGet(), doPost() 三种方式的参数列表都是一样的。
所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
中文问题
获取中文的参数
方法一:
1.login.html加上
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
//告诉浏览器给服务器发送消息时使用UTF-8编码
2.login.html的form的method修改为post
3.在servlet进行解码和编码
byte[] bytes= name.getBytes("ISO-8859-1");
name = new String(bytes,"UTF-8");
方法二:在request.getParameter之前加上request.setCharacterEncoding("UTF-8");
返回中文响应
在Servlet中加上response.setContentType("text/html",charset="UTF-8");
生命周期
一个Servlet的生命周期:
实例化->初始化->提供服务->销毁->被回收
实例化/初始化
1.当用户通过浏览器输入一个路径
这个路径对应的servlet被调用的时候该Servlet就会被实例化(构造方法被调用)
无论访问了多少次LoginServlet构造方法只执行一次,所以Servlet是单实例的
2.init(ServletConfig)是一个实例方法在构造方法执行之后执行,无论访问多少次初始化只执行一次
提供服务
service/doGet/doPost方法中执行业务代码
销毁destoy()
1.关闭tomcat时destroy()方法会被调用
2.该Servlet所在的web应用重新启动时
<Context path="/"
docBase="e:\\project\\j2ee\\web"
debug="0" reloadable="false" />
如果把 reloadable="false" 改为reloadable="true"
就表示有任何类发生的更新,web应用会自动重启
当web应用自动重启的时候,destroy()方法就会被调用
跳转
服务端跳转
request.getRequestDispatcher("success.html").forward(request, response);
//浏览器路径依然是/login,并不会变成success.html
success.png
客户端跳转
response.sendRedirect("fail.html");//浏览器地址发生变化
fail.png
自启动
有的时候会有这样的业务需求:
tomcat一启动,就需要执行一些初始化的代码,
比如校验数据库的完整性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。
如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现自启动
即,伴随着tomcat的启动,自动启动初始化,
在初始化方法init()中,就可以进行一些业务代码的工作了。
在web.xml中,配置Hello Servlet的地方
增加一句<load-on-startup>10</load-on-startup>
(取值范围1-99代表启动顺序小的数字先启动)