Servlets&JSP学习笔记:作为Servlet

时间:2021-12-01 16:01:50

Servlet的一生:

    1.用户单击一个链接,链接的URL指向一个Servlet
2.容器“看出”这个请求指向一个Servlet,所以容器创建两个对象:(1)HttpServletResponse(2)HttpServeletRequest
3.容器根据请求中的URL查找正确的servlet,为这个请求创建或分配一个线程,加载servlet类。
4.初始化servlet(构造函数运行),servlet的构造函数不含参数,不能被重写。
5.调用init(),记住,init在servlet一生中只调用一次,而且必须在service方法调用之前完成。init()方法可以被重写(如果由初始化代码,比如得到一个数据库连接,或向其他对象注册,就要覆盖init()方法)。
6.调用service()方法(传递请求和响应对象作为参数)。service()方法根据客户发出的Http方法(Get,Post等),确定要调用哪个servlet方法。service方法不能被重写。
客户发出了一个Http请求,所以service()方法会调用servlet的doGet()或doPost方法,并传递请求和响应对象作为参数。我们至少覆盖其中的一个方法。
7.servlet使用响应对象将响应发至客户。响应通过容器传回。
8.service()方法结束,调用destroy()方法,所以线程要么撤销,要么返回到容器管理的一个线程池。请求和响应对象引用已经出了作用意义(可以垃圾回收)。与init()一样,destroy()也只能调用一次。
客户得到响应。

MVC

    在这之后,我们来看看MVC模式(模型——视图——控制器)。MVC的关键是,业务逻辑要与表示分离,而且要在二者之间放上别的东西,这样业务逻辑本身就作为一个可重用的Java类存在,它根本不会对视图由任何了解。
视图(JSP):负责表示方面。它从控制器得到模型的状态。另外视图还要获得用户输入,并提交给控制器。
控制器(servlet):从请求获得用户输入,并明确这些输入对模型有什么影响。告诉模型自行更新,并且让视图(JSP)能得到最新的模型状态。
模型(Java类)包含具体的业务逻辑和状态。换句话说,模型知道用什么规则来得到和更新状态。系统中只有这部分和数据库通信(不过,它可能会使用另一个对象完成具体的数据库通信)。

请求(request)

doget():针对简单请求。
dopost():来接受和处理表单数据。
get:
1.使用get时,参数数据会显示在浏览器的输入栏(URL的后面),会造成数据不安全。
2.对参数数据有限制,参数数据只能是放在请求行的内容。
3.最终用户可以对请求页面建立书签
4.幂等,只是要得到东西,不会修改服务器的任何内容,可以执行多次,也不会造成任何不好的副作用。
post:
1.参数数据在体里,因此不会造成不安全,也没有只能是放在请求行的约束。
2.最终用户不能对请求页面建立书签。
3.非幂等,Post体中的提交数据可能用于不可逆转的事务。
4.Post不是默认的,如果没有在表单中规定method="POST",就会默认为HTTPGET请求。

响应(response)

setContentType():告诉浏览器要发回什么。
getOutputStream():实例化PrintWriter,用于处理字符数据。
getWriter():实例化ServeletOutputStream,用于写其他内容。
然而,PrintWriter实际上“包装”了ServletOutputStream,也就是说PrintWriter有ServletOutputStream的一个引用。

重定向:调用sendRedirect()方法,让浏览器访问其中的地址(绝对地址/相对地址)。
请求分派:调用getRequestDispatcher(),让服务器另外分派一个页面来完成。