1.百度百科解释:https://baike.baidu.com/item/servlet/477555?fr=aladdin
2.自己的见解:是一个Java程序,运行在服务器端,为客户端的操作做出不同的响应,实现不同功能的一段代码。在Java中为一个能实现的接口。
3.单词释意:Servlet为Server Applet缩写(参照百度翻译)
1.Servlet中一共有五个方法
package javax.servlet;
import java.io.IOException;
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
)
init方法用于服务器载入 Servlet 时执行的。可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时载入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init(),init()只执行一次。一个Servlet只创建一次,属于单例的对象。
在并发的场景下,Servlet属于线程不安全的对象, 不建议定义成员变量。
getServletConfig()用来返回初始化参数和ServletConfig。
ServletConfig为一个接口
/**
* A servlet configuration object used by a servlet container to pass
* information to a servlet during initialization.
*/
public interface ServletConfig {
/**
* Returns the name of this servlet instance. The name may be provided via
* server administration, assigned in the web application deployment
* descriptor, or for an unregistered (and thus unnamed) servlet instance it
* will be the servlet's class name.
*
* @return the name of the servlet instance
*/
public String getServletName();
/**
* Returns a reference to the {@link ServletContext} in which the caller is
* executing.
*
* @return a {@link ServletContext} object, used by the caller to interact
* with its servlet container
* @see ServletContext
*/
public ServletContext getServletContext();
/**
* Returns a String
containing the value of the named
* initialization parameter, or null
if the parameter does not
* exist.
*
* @param name
* a String
specifying the name of the
* initialization parameter
* @return a String
containing the value of the initialization
* parameter
*/
public String getInitParameter(String name);
/**
* Returns the names of the servlet's initialization parameters as an
* Enumeration
of String
objects, or an empty
* Enumeration
if the servlet has no initialization parameters.
*
* @return an Enumeration
of String
objects
* containing the names of the servlet's initialization parameters
*/
public Enumeration getInitParameterNames();
}
此接口主要是在servlet初始化时提供一些环境信息
此接口的此方法 public ServletContext getServletContext();主要 用来获取一个servlet环境(ServletContext),此环境可以用来存储一些全局信息。如下:
ServletContext用法(ServletContext也是一个接口,此环境有非常多的方法)
//获取ServletContext
HttpSession session = request.getSession();
ServletContext application = session.getServletContext();
//存值 注意第一个为String,第二个为Object
application.setAttribute(String name,Object value);
//取值
Object obj = application.getAttribute(String name);
//移除属性
application.removeAttribute(name);
常用的有
1获取环境路径
2获取资源:根据名字获取资源
3设置资源:设置资源对象并设置相关名字
4移除资源:根据名字移除资源
5获取转发跳转器(RequestDispatcher也是一个接口其中有forword和include方法)
1 public String getContextPath();
2 public Object getAttribute(String name);
3 public void setAttribute(String name, Object object);
4 public void removeAttribute(String name);
5 public RequestDispatcher getRequestDispatcher(String path);
最常用的方法:用于接受请求req和响应请求res
通常是使用其抽象类GenericServlet(此类继承了Servlet, ServletConfig)的子类HttpServlet中的
service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}方法
使用此方法操作使用http协议传输的请求和响应。
返回servlet的一些信息,比如作者版本和版权信息。
此方法只在所有线程都退出此servlet的使用后才能调用,调用之后,servlet容器不会在调用此servlet的service方法。
一个service的方法的重写例子
public class LogOut extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false);
session.invalidate();
response.sendRedirect(request.getContextPath() + "/JSPCON/Login.jsp");
}
}
从请求中获取会话的对象
关闭会话
重定向到登录页面
service方法就是servlet中用来处理请求和响应的最关键的方法。
编写不同的servlet中的service方法从而为客户实现不同的请求和响应功能。提供不同的服务(service)。
xml文件需放在WEB-INF下
lib里则放一些外部的jar包,lib和xml并列放在WEB-INF下
AddAction
contactsSystem.servlet.AddAction
AddAction
/admin/AddAction
配置好后可通过${pageContext.request.contextPath}/admin/AddAction跳转到此servlet执行相关操作
| |
项目名 + URL-pattern
例如表单操作 ,向此servlet提交数据
此servlet代码
public class AddAction extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
String name = request.getParameter("name");
String mobile = request.getParameter("mobile");
String telphone = request.getParameter("tel");
String email = request.getParameter("email");
String city = request.getParameter("city");
String birth = request.getParameter("birth");
// 3 调用service业务功能
PersonServiceImpl pImpl = new PersonServiceImpl();
try {
pImpl.regist(name, mobile, telphone, email, city, birth);
} catch (Exception e) {
e.printStackTrace();
}
// 4 跳转
response.sendRedirect(request.getContextPath()+"/admin/FindByPageAction?pageId=1");
//request.getRequestDispatcher("/admin/FindAllAction").forward(request, response);
}
}
URI = Universal Resource Identifier
统一资源标识符
URL = Universal Resource Locator
统一资源定位符
可参考博客https://blog.csdn.net/qq_26975307/article/details/54429760
自己的理解:
URL:常用到浏览器的地址 https://mp.csdn.net/postedit/82670519 一个链接就是一个URL。
URI:大多用在访问web资源,image,html,js,jsp,在javaweb开发中格式一般为 / 项目名 / 资源相对路径
| |
/ Java工程名 / url-pattern
url-pattern:用在一个项目中替换掉资源的真实路径的地址,也就是相对路径,浏览器通过访问这个相对路径(虚假的路径)去访问真实路径下的资源,浏览器地址栏显示的就是此相对路径。
地址栏请求:URL请求
超链接请求:URI请求
HTML页面表单请求:URI请求
GET : 地址栏拼接
POST :表单的method=POST
服务器端程序如何获取请求参数
自己的理解:
1.请求转发:(用法)request.getRequestDispatcher(目标Servlet的url-pattern).forward(request,response);
举例:
客户机像服务器发出请求,服务器当前servlet解决不了,把请求转发给其他servlet,其他servlet亲自(返回数据时不再通过第一个被请求的servlet)把请求结果反馈给客户机。
客户机地址栏不变,因此不知道是当前servlet解决的问题还是转发给其他servlet解决的。
特点:
1.1 地址栏不变 | 因为转发动作发生在服务器内部,用户并不知道
1.2 请求转发连接的两个Servlet处于一次请求中
1.3 请求转发连接的两个Servlet只有最后一个有权利响应结果 .
2.重定向:(用法)response.sendRedirect(目标的URI);
举例:
当客户机向服务器发出请求,服务器直接返回一个能解决此问题的servlet的URL,让客户机自己去通过URL去寻找能解决此请求的servlet
特点:
2.1 地址栏改变。 动作发生在服务器外部。
2.2 重定向连接的两个Servlet,处于两次请求。 | 重定向连接的两个Servlet不能使用request作用域传递数据。
使用场景:
两个Servlet之间,需要传递大量的数据。
两个 Servlet之间,没有大量的数据需要传递。
什么是Cookie : Cookie是客户端浏览器上的一小段字符串信息, 以key-value的形式存储。
Cookie的基本使用:
1 向客户端浏览器设置Cookie
- 创建: Cookie cookie = new Cookie(String name,String value);
- 设置到客户端浏览器: response.addCookie(cookie);
2 服务器端如何获取客户端浏览器的cookie:
- Cookie[] cookies = request.getCookies();
PS: 网站只能获取到自己服务器设置到客户端浏览器上的Cookie .
3 基本的方法:
- 获取Cookie名字:String name = cookie.getName();
- 获取 Cookie的值:String value = cookie.getValue();
- 手动设置Cookie存活时间:
cookie.setMaxAge(大于0整数); -- 代表存活时间/秒
cookie.setMaxAge(0); -- 代表删除指定cookie
cookie.setMaxAge(负数); -- 不会设置cookie
4 Cookie的生命周期:
- 默认: 关闭浏览器Cookie销毁。
- 可以手动设置Cookie存活时间:cookie.setMaxAge(时间/秒);
5.Cookie的缺陷:
5.1 Cookie明文存储信息,不安全
5.2 默认存储的数据量下,最多大概4KB
5.3 默认不支持中文
5.4 Cookie存在被禁用的风险
什么是Session: 是HttpSession对象功能的简称, 一个session对象代表用户的一个会话,同时HttpSession也是一个作用域(session作用域)。 Session是在服务器端记录用户的信息。
Session的基本使用:
1 .创建:HttpSession session = request.getSession(true) | request.getSession();
- request.getSession(true) : 如果没有当前用户的会话对象,创建一个新的session. 如果有则直接返回给用户使用
- request.getSession(false) : 如果没有当前用户的会话对象,不会创建session. 如果有则直接返回给用户使用。
2.常用的方法:
- 存数据:session.setAttribute(String name,Object value);
- 取数据:Object value = session.getAttribute(String name);
- 返回sessionid:session.getId();
- 移除指定命名属性: session.removeAttribute(String name);
PS: session作用域中数据共享范围是 一次会话有效。
3.Session作用域的生命周期
创建: 用户开启一次会话, 第一次请求服务器 request.getSession(true);
销毁:
- 手动销毁: session.invalidate();
- 超时策略: 从用户最后一次向服务器发起的请求结束,开始计时, 到了指定的session存活时间,session会自动销毁。
- Tomcat服务器默认 30分钟销毁session.
- 手动配置session销毁时间
全局的配置: 当前服务器中所有web应用中的 session都会受到影响
PS: 局部的配置会覆盖全局的。建议配置时间为正数。
4.Session的钝化与活化
钝化: 当服务器重启或关闭时,将服务器中没有超时的session序列化到磁盘上保存起来。
活化: 服务器正常运行后, 对应的用户请求服务器时,服务器会将其没有到时的session反序列化到内存中,给用户使用。
目的: 确保服务器关闭或重启是,用户的会话对象不丢失。