学习下servlet

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对象与字符串相互转换

  1. 对象转为字符串:JSON.stringify(obj);
  2. 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映射

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值