Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
开发一个servlet需要如下几个步骤:
创建web应用项目
编写servlet代码
部署到tomcat中
get:
1是form默认的提交方式
2通过一个超链访问某个地址;在地址栏直接输入某个地址;ajax指定使用get方式的时候
3提交数据会在浏览器显示出来
4不可以用于提交二进制数据,比如上传文件
post:
1必须在form上通过 method=“post” 显示指定;ajax指定post方式的时候
提交数据不会在浏览器显示出来
2可以用于提交二进制数据,比如上传文件
HttpServlet提供了doPost方法和doGet方法,从而可以进行请求与相应
web.xml提供路径与servlet的映射关系
servlet获取从浏览器提交的账号密码与返回响应 :
1.写个form表单,method用post,action指向路径
2.在web.xml中映射Servlet类到路径
3.在servlet类里面写一个doPost方法,通过request.getParameter()获取
4.判断账号密码,创建对应的html字符串。然后通过response.getWriter().println() 发送到浏览器。
细节:
首先打开一个静态的html页面,在这个页面中可以通过form,以post的形式提交数据
tomcat接受到一个新的请求:http://127.0.0.1/login其路径是/login,接着就到配置文件web.xml进行匹配,通过路径找对应的Servlet类,接下来的工作,就会基于这个Servlet进行。
Tomcat 定位到了Servlet类后,发现并没有Servlet类的实例存在,于是就调用Servlet类的public无参的构造方法Servlet()实例化一个Servlet对象以备后续使用
然后Tomcat从上一步拿到了Servlet的实例之后,根据html提交信息的时候带的method=“post”,去调用对应的doPost方法。
在这个方法中,通过参数request,把页面上传递来的账号和密码信息取出来
接着,根据账号和密码是否正确, 创建不同的html字符串,然后把html字符串设置在response对象上。到这里,Servlet的工作就做完了。
在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response生成html 字符串,然后再通过HTTP协议,这个html字符串,会从服务器发给浏览器,浏览器再根据HTTP协议获取这个html字符串,并渲染在界面上。
HTTP 超文本传输协议 Hyper Text Transfer Protocol :
当我们在浏览器的地址栏输入一个地址的时候,就能够访问服务器的某个页面。这个过程本身就是两个应用程序之间的交互,一个应用程序是浏览器,另一个应用程序是服务器。
协议就是不同的应用程序之间按照事先做好的约定进行的通信。 这样就能互相读懂对方的意思。
浏览器和WEB服务器之间,使用的就是一种叫做HTTP的协议, 这是BS (Browser Server )架构模型的基础 。
Servlet类继承的HttpServlet同时有个方法service(HttpServletRequest , HttpServletResponse ),实际上在执行doGet()或者doPost()之前,都会先执行service(),由service()方法进行判断,到底该调用doGet()还是doPost()
可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。
什么是参数列表?当你在编写一个方法时,你不知道方法形参的类型或者是形参的长度时,你就可以使用参数列表来代替。
所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
servlet生命周期:
一个Servlet的生命周期由 实例化,初始化,提供服务,销毁,被回收 这几个步骤组成
实例化:当用户通过浏览器输入一个路径,这个路径对应的servlet被调用的时候,该Servlet就会被实例化,为Servlet类显式提供一个构造方法 Servlet()
无论访问了多少次Servlet类,Servlet类构造方法只会执行一次,所以Servlet是单实例的
单例模式:
单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。
1.构造方法私有化
2.静态属性指向实例
3.写一个静态类方法,返回第二步的静态类属性
初始化:Servlet类继承了HttpServlet,同时也继承了init(ServletConfig) 方法,init 方法是一个实例方法,所以会在构造方法执行后执行。无论访问了多少次Serlvet类,init初始化只会执行一次
*init() 是可以重写的,有些业务需要你在 Servlet 提供服务之前就要做,这时可以通过 init() 来写你需要的业务代码
提供服务:接下来就是执行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法。在service()中就会编写我们的业务代码
销毁:接着是销毁destroy(),在如下几种情况下会调用destroy():
1.该Servlet所在的web应用重新启动
2.关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现。
被回收:当该Servlet被销毁后,就满足垃圾回收的条件了。 当下一次垃圾回收GC来临的时候,就有可能被回收。这个也是不容易被观察到的现象。
servlet跳转:
页面跳转是开发一个web应用经常会发生的事情。比如登录成功或是失败后,分别会跳转到不同的页面。跳转的方式有两种,服务端跳转(转发)和客户端跳转 (重定向)
服务端跳转
request.getRequestDispatcher("XXX.html").forward(request, response);
客户端跳转
response.sendRedirect("XXX.html");
服务端一般便于传输数据,客户端就完全是另一个页面了。
servlet自启动
有的时候会有这样的业务需求:
tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现自启动,即伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了。
在web.xml中加:
<load-on-startup>10</load-on-startup>
表明该Servlet会随着Tomcat的启动而初始化。
10表示启动顺序,如果有多个Servlet都配置了自动启动,数字越小,启动的优先级越高
servlet的request方法和response方法
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如可以多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
response是HttpServletResponse的实例,用于提供给浏览器的响应信息
通过response.getWriter(); 获取一个PrintWriter 对象,可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。
PrintWriter pw= response.getWriter();
pw.println("<h1>Hello Servlet</h1>");
客户端有两种跳转:302 表示临时跳转;301 表示永久性跳转
302:response.sendRedirect("XX.html");
301:response.setStatus(301); response.setHeader("Location", "XX.html");
301和302的区别主要在搜索引擎对页面排名的时候有影响(如果有SEO需求,通产都会做301,其他的就用302居多了。)
servlet的增删改查
组成:(0.建数据库)1.实体类2.Dao类3.servlet类4.web.xml
大致思想:有了实体类和Dao类,就可以写sql语句,在servlet里用html写的页面就可以“活了”,servlet类调用Dao类的方法,进行增删改查操作
R - Retrieve 查询:
1.在一个servlet类(主页面)里面调用Dao类的查看所有方法
2.通过StringBuffer拼接成一个table用于显示其内容
3.遍历出来
4.response出toString()(返回当前对象的字符串表达)
5.web.xml映射一个路径到一个servlet类
C - Creation 增加:
1.在web目录下增加addHero.html
2.到了Servlet增加类之后,根据浏览器传过来的参数,创建一个对象。 接着通过DAO类的增加方法把该对象保存到数据库中。
3.最后使用客户端跳转到查看所有的对象(主页面)
4.web.xml映射一个路径到一个servlet类
D - DELETE 删除 :
1.为table新增加一列delete,对于每条数据增加一个delete超链接
2.到了servlet删除类之后,首先获取参数id,然后通过DAO类根据id删除该对象然后客户端跳转到主页面
3.web.xml映射一个路径到一个servlet类
U - Update 修改:
1.为table新增加一列 edit,对于每条数据里面增加一个edit超链接
2.到了servlet获取类后,根据浏览器传过来的id获取一个对象,然后根据这个对象,准备一个类似增加的页面,不同之处在于每个输入框都是有值的。(这里不能写个html,因为获取不了值,所以只能在类里面写页面)
最后还会提供一个type="hidden"的input,用于提交id到路径
type=‘hidden’:隐藏域在页面中对于用户是不可见的
3.到了Servlet修改类之后,根据浏览器提交的数据创建一个对象,然后调用DAO类的修改方法,进行更新。更新结束后,客户端跳转到主页面
4.web.xml映射两个路径到两个servlet类
servlet弊端:
在Servlet编写html代码很痛苦,效率不高,可读性差,难以维护。
最好可以在html文件里面写html代码,同时又能在里面调用java的变量,那么这样就需要学习JSP了。
servlet JSON
JSON:一种与开发语言无关的、轻量级的数据存储格式,全称JavaScript Object Notation,一种数据格式的标准规范,起初来源于JavaScript这门语言
提交数据:
1.在html里面,写一个form表单
2.之后再写一个js,点击提交之后,把form中的数据取出来,组织成json的格式,用ajax发送出去
<script>
$('#sender').click(function(){
//点击提交之后,把form中的数据取出来,组织成json的格式,根据url用ajax发送去后台
var url;
//写一个json格式的对象
var json;
$.post(
//想通过url传到tomcat后台服务器
url,
//把前端浏览器里的json对象变为json字符串,后台tomcat可以通过XX进行打印查看
{"data":JSON.stringify(json)},
function(data) {
//服务器又返回给浏览器
});
});
</script>
3.根据url再web.xml添加一个映射
获取一个或多个对象:
1.写一个JSON获取类,继承HttpServlet,在类里面new一个对象,注入参数
2.创建一个JSONObject 对象,把对象转换为JSONObject 对象,并放在上面json的put()方法,key是"XX"
源码里面是这样的
public JSONObject put(String key, Object value){}
JSONObject json= new JSONObject();
json.put("XX", JSONObject.fromObject(对象));
//如果是获取集合:
//JSONSerializer.toJSON(heros).toString();
//准备一个集合list,通过JSONSerializer.toJSON(heros)把集合转换为JSON字符串返回给浏览器
3.response返回
js对象与字符串相互转换
- 对象转为字符串:JSON.stringify(obj);
- json字符串转为对象:JSON.parse(str);
4.服务器和浏览器之间通信是通过http协议进行的,而http协议传输非二进制数据,都是用的字符串。所以浏览器只能拿到字符串,然后再通过js把字符串转换为对象
这里json对象和json字符串是不一样的
JSON对象是直接可以使用JQuery操作的格式,JSON字符串仅仅只是一个字符串,比如:
//person就是json对象。可以用perosn.name这种方式进行属性的调用。第三行代码就是看person的类型,为object类型。
var person={"name":"zhangsan","sex":"男","age":"24"}//json对象
alert(person.name);//zhangsan
alert(typeof person);//object
//JavaScript中的字符串是单引号或者双引号引起来的。
//字符串的格式符合json的格式,第三行代码也匹配其中的类型为string。
var person='{"name":"zhangsan","sex":"男","age":"24"}';//json字符串
alert(person);//{"name":"zhangsan","sex":"男","age":"24"}
alert(typeof person);//string
//json字符串转json对象,调用parse方法:
var person='{"name":"zhangsan","sex":"男","age":"24"}';//json字符串
var personObject = JSON.parse(person);
alert(personObject.name);//zhangsan
//json对象转为json字符串,调用stringify方法:
var person={"name":"zhangsan","sex":"男","age":"24"};//json对象
var personString = JSON.stringify(person);
alert(personString);
所以:
<script>
$('#sender').click(function(){
var url;
$.post(
url,
//前端传入后台的应该是一个json格式的字符串,而不是一个json对象
function(data) {
// 如果是获取多个对象,那么就把返回的数据,通过 $.parseJSON转换为json数组存到json,再加个for(i in json){ }遍历数组,显示在div中
//var json=JSON.$.parseJSON(data);
var json=JSON.parse(data);
var X=json.XX;
//点击sender按钮之后,通过ajax访问url,获取数据成功后,把json字符串通过JSON.parse 转换为json对象,获取对象,显示在div里
$("#messageDiv").html("X:"+X);
});
});
</script>
5.在web.xml映射