JSP程序设计【四】

一、Servlet


Servlet是服务器端的小服务程序,它能够处理客户端的请求并产生响应。Servlet将HTTP请求和响应封装在Java类中实现各种Web应用,Servlet对象由Servlet容器管理(创建、使用、销毁),客户端可以通过访问Servlet获取服务。JSP最后的形式也是Servlet,这个转换过程是由JSP容器自动完成的,JSP是Servlet技术的一种应用。

1、如何编写Servlet

因为:Servlet以Java类的形式实现,所以:编写Servlet就是编写Java类

  • 1、创建包
  • 2、创建Servlet类
    • 部署方式有两种,一是注解方式,二是描述符方式。一般使用注解方式,比较方便,之后解释。
  • 3、编写代码处理请求 + 产生响应
    • 基本上都是在processRequest()中处理

JSP:HTML中嵌入Java代码

Servlet:Java代码中输出HTML

2、Servlet的部署

部署Servlet的目的就是告诉Servlet容器Servlet的具体情况,以便于容器进行管理。例如:Servlet叫什么名字
Servlet的访问形式、Servlet的初始化参数等等

①基于注解的部署方式

  • 位置:在类定义的上面一行
  • 基本格式
    • @WebServlet(name = “MyServlet”, urlPatterns = {“/MyServlet”})
    • @WebServlet:注解标志
    • name:Servlet的名称,默认为Servlet的类名
    • urlPatterns:指定一组Servlet的URL匹配模式,有多个时以逗号分隔

②基于描述符的部署方式

位置:Web页 -> WEB-INF-> web.xml

3、Servlet的访问

①在浏览器地址栏中直接访问

1
http://localhost:8084/HelloJsp/MyServlet

②通过表单访问

1
2
3
<form action="MyServlet" method="POST">
访问MyServlet <input type="submit" value="访问" />
</form>

③通过超链接访问

1
<a href="MyServlet">访问MyServlet</a>

传递参数问题:

  • 在URL中直接传递: MyServlet?name=value&name=value
  • 通过表单传递:<form> … </form>

然后在servlet中使用request等获取进行处理

例如:

4、Servlet的相关类与接口

Servlet中文API文档-个人整理版

Java Servlet API中文说明文档

注意:斜体方法为抽象,所以service是在HttpServlet中实现的,在GenericServlet中没有实现,但是继承自Servlet接口中的其他四个方法实现了。其它同理能看出。

当你在写Servlet的时候必须直接或间接的Servlet实现这个接口。一般趋向于间接实现:通过从javax.Servlet.GenericServlet或javax.Servlet.http.HttpServlet派生

而在自己编写web在实现HttpServlet时,必须至少重写下面中的一个

  • doGet()
  • doPost()
  • doPut()
  • doDelete()
  • init(),初始化servlet对象,完成一些初始化工作。
  • destroy(),当容器监测到一个servlet从服务中被移除时,容器调用该方法,释放资源。
  • getServletInfo(),获取servlet相关信息。

所以编写servlet主要就是重写方法、添加成员、使用对象。下面介绍对象的功能

5、Servlet的已经写好的可使用的,方便我们编写web功能的类

(1)HttpSevletRequest

HttpServletRequest和ServletRequest都是接口HttpServletRequest继承自ServletRequest HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。 例如:getHeader(), getMethod() , getSession()

详细方法解读:

javaweb学习总结(十)——HttpServletRequest对象(一)

HttpServletRequest详解

HttpServletRequest详解:获取HTTP请求消息

(2)HttpSevletResponse

详细方法解读:

javaweb学习总结(七)——HttpServletResponse对象(一)

javaweb学习总结(八)——HttpServletResponse对象(二)

HttpServletResponse详解:封装HTTP响应消息

(3)HttpSession

方法详解:

http://www.51gjie.com/javaweb/863.html

方法详解:

http://www.51gjie.com/javaweb/859.html

(5)ServletContext

ServletContext用来存放全局变量,每个Java虚拟机每个Web项目只有一个ServletContext,这ServletContext是由Web服务器创建的,来保证它的唯一性。由于一个WEB应用中的所有Servlet共享同一个ServletContext象,因此Servlet对象之间可以通过ServletContext对象通讯。ServletContext对象通常也被称之为Context域对象。

详细方法解释

http://www.51gjie.com/javaweb/854.html

ServletConfig和ServletContext接口及其使用方法详解(附带实例)

(6)ServletConfig

方法说明功能描述
String getInitParameter(String name)根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames()返回一个 Enumeration 对象,其中包含了所有的初始化参数名
ServletContext getServletContext()返回一个代表当前 Web 应用的 ServletContext 对象
String getServletName()返回 Servlet 的名字,即 web.xml 中元素的值

ServletConfig和ServletContext接口及其使用方法详解(附带实例)

6、Servlet工作原理

Servlet对象的生命周期由容器统一管理,我们只要在需要的方法中添加满足功能要求的代码即可。

  • 初始化调用init方法,对象创建后,只一次
  • 服务调用service方法,每次请求都会调用,在不同线程中执行
  • 销毁调用destroy方法,服务器关闭时,只一次

7、Servlet的应用

(1)初始化参数(文件操作)

  • ①注解方式(在 @WebServlet 注解中添加,相对固定)
  • ②描述符方式(在 web.xml 配置文件中添加,相对灵活)
  • ③获取初始化参数

(2)共享变量

根据Servlet的生命周期,一个Servlet被请求而创建对象后,其成员变量可被共享

  • 例如:由此可以由多个用户共同计算一个表达式

(3)重定向(Redirect)、转发(Forward)、包含(Include)

在servlet中转发可使用绝对路径:例如http://localhost:8084/HelloJsp/ch05/login.jsp或者/HelloJsp/ch05/login.jsp

jsp跳转到servlet使用../+servlet名例如:action=”…/LoginServlet”method=”post”id=“form” >,因为默认注解方式的servlet放置在了根目录下

servlet相对路径跳转相对于servlet配置的路径,使用默认系统注解的servlet配置在根目录(‘/’意味着根目录)下。所以若默认注解改为/ch05/CheckLogin,则jsp跳转到servlet直接使用LoginServlet即可同时servlet跳转到jsp只需要使用login.jsp即可

设置servlet的urlpattern时,写在最后是servlet名。名为CheckLogin的servlet放在根目录则为/CheckLogin,放在ch05文件夹下则为/ch05/CheckLogin

服务器在解析绝对路径时,比浏览器解析绝对路径时,,多了一部分,这部分就是项目名,项目文件夹这里是hellojsp

服务器在解析路径时,’src’,’WebRoot’,这些文件夹其实都忽略了,这样说或许不准确,但便于理解,也解释说,则两个目录下的文件,都是在同一个根目录下,

客户端解析路径不会从项目文件夹,而是根目录即web目录

详细路径跳转问题:https://www.cnblogs.com/alsf/p/9194268.html

  • 1.重定向(Redirect):从当前 Servlet 重定向到另一个 Servlet 或 JSP
    • 实现:response.sendRedirect(location);
    • location:
      • 直接:String location = “url”;
      • 编码:String location = response.encodeRedirectURL(url);该方式会将sessionID存入url维持回话
    • 注意:
      • 浏览器中的地址发生变化(客户端发出了对新地址location的新请求)
      • 原请求不能传递到重定向的位置(发出新请求则原请求即失效)
  • 2.转发(Forward):将当前的请求转发到另一个 Servlet 或 JSP
    • 实现:
      • ①获取转发器 RequestDispatcher rdisp = request.getRequestDispatcher(path);
      • ②进行转发rdisp.forward(request, response);
      • 直接request.getRequestDispatcher(path).forward(request,response);
    • path:
      • 相对路径:相对当前servlet的位置
      • “/”开始,以当前服务目录的根目录为起始点
    • 注意:
      • 浏览器中的地址不变化(客户端没有发出新的请求,服务器进行再处理)
      • 请求能够传递到所转发的位置(请求可在转发到的页面中继续进行处理)
      • <jsp:forward page = "…" />转为Java代码就是如此
  • 3.包含(Include):将另一个 Servlet 或 JSP 的执行结果包含到当前的 Servlet 中
    • 实现:
      • ①获取转发器 RequestDispatcher rdisp = request.getRequestDispatcher(path);
      • ②进行包含rdisp.include(request, response);
      • *直接request.getRequestDispatcher(path).include(request,response); *
    • 说明:
      • path:与 Forward 含义相同
      • 浏览器中的地址不变化(客户端没有发出新的请求)
      • 请求能够传递到所包含的位置(请求可在被包含的页面中继续进行处理)
      • <jsp:include page = "…" />转为Java代码就是如此
  • include和Forward的区别:forward方法是把百请求的内容转发到另外的一个度servlet.而include是把另一个servlet处理过后的内容拿过来

(4)session与Cookie

  • 1.使用session

  • 2.使用cookie的一般过程

    • 创建一个cookie(在服务器端创建,用于添加) Cookie cookie = new Cookie(name, value); //name, value都是String
    • 读取cookie(从客户端读到服务器,用于获取等) Cookie[] cookies = request.getCookies();
    • 将一个cookie添加到客户端(发送到客户端,用于保存) response.addCookie(cookie);
  • 浏览器对cookie处理方式的设置

    • Internet选项 ->隐私 ->高级 ->Cookie
  • 3.session 与 cookie 比较

    • 存在的位置
      • session保存在服务器端(对象形式)
      • cookie保存在客户端(文件形式)
    • 有效期
      • session的有效期(发呆时间) - 达到发呆时间、invalidate、关闭浏览器
      • cookie的有效期可使用setMaxAge方法进行设置(默认为浏览器关闭时)
    • 安全性
      • session比cookie的安全性高(cookie可能会被窃取、篡改、……)
    • 网络传输量
      • session直接保存在服务器端,不需要进行传输(占用服务器内存空间)
      • cookie需要通过网络在客户端与服务器端进行传输(占用客户端磁盘空间)

*jsp设置的session值,在servlet取出为null的问题:一般情况下使用HttpSession session=request.getSession(false); *

https://blog.csdn.net/xxd851116/article/details/4296866

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~