一、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 | <form action="MyServlet" method="POST"> |
③通过超链接访问
1 | <a href="MyServlet">访问MyServlet</a> |
传递参数问题:
- 在URL中直接传递: MyServlet?name=value&name=value
- 通过表单传递:
<form> … </form>
然后在servlet中使用request等获取进行处理
例如:
4、Servlet的相关类与接口
注意:斜体方法为抽象,所以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()
详细方法解读:
(2)HttpSevletResponse
详细方法解读:
javaweb学习总结(七)——HttpServletResponse对象(一)
(3)HttpSession
方法详解:
(4)Cookie
方法详解:
(5)ServletContext
ServletContext用来存放全局变量,每个Java虚拟机每个Web项目只有一个ServletContext,这ServletContext是由Web服务器创建的,来保证它的唯一性。由于一个WEB应用中的所有Servlet共享同一个ServletContext象,因此Servlet对象之间可以通过ServletContext对象通讯。ServletContext对象通常也被称之为Context域对象。
详细方法解释
(6)ServletConfig
方法说明 | 功能描述 |
---|---|
String getInitParameter(String name) | 根据初始化参数名返回对应的初始化参数值 |
Enumeration getInitParameterNames() | 返回一个 Enumeration 对象,其中包含了所有的初始化参数名 |
ServletContext getServletContext() | 返回一个代表当前 Web 应用的 ServletContext 对象 |
String getServletName() | 返回 Servlet 的名字,即 web.xml 中 |
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目录
- 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(在服务器端创建,用于添加)
浏览器对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); *