Servlet学习
Http协议:规定对浏览器客户端和服务器端之间数据传输的格式规范。
HttpServletRequest对象: 请求对象。获取请求信息
请求行:request.getMethod()
request.getRequestURI/getRequestURL()
request.getProtocol();
请求头: request.getHeader("name") request.getHeaderNames()
实体内容: request.getInputStream()
获取参数数据:(GET或POST)
request.getParameter("name") 一个值的参数
request.getParameterValues("name"); 多个值的参数
request.getParameterNames() 所有参数
响应头(location(结合302状态码完成请求重定向功能)、 refresh(定时刷新)、content-type、 content-disiposition(以下载方式打开)
HttpServletResponse对象: 响应对象。 可以设置响应信息
响应行: response.setStatus();
响应头: response.setHeader("name","value")
实体内容:
(PrintWriter) response.getWriter().writer(); 字符内容
(OutputStream) response.getOutputStream().writer(); 字节内容
运行原理:
tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件,然后通过反射创建servlet对象,并且调用里面的service方法
通过反射:
a)构造FirstServlet的对象
b)然后调用FirstServlet里面的service方法
servlet是单例的,如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。
对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。
事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated
修改session全局有效时间:分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
设置cookie的有效路径。默认情况:有效路径在当前web应用下
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
response.setHeader("set-cookie", cookie.getName()+"="+cookie.getValue()+",email=eric@qq.com");
response.addCookie(cookie1);
String name = request.getHeader("cookie");
request.getCookies();
1 2 3 4 | InputStream in = this .getServletContext().getResourceAsStream( "/WEB-INF/classes/db.properties" ); Properties prop = new Properties(); prop.load(in); String user = prop.getProperty( "user" ); |
修改session的有效时间
session.setMaxInactiveInterval(20);
手动发送一个硬盘保存的cookie给浏览器
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
销毁session
HttpSession session = request.getSession(false);
if(session!=null){
session.invalidate();//手动销毁
}
*.html(伪静态)
注意:
url-pattern要么以 / 开头,要么以*开头。 例如: itcast是非法路径。
不能同时使用两种模糊匹配,例如 /itcast/*.do是非法路径
当有输入的URL有多个servlet同时被匹配的情况下
精确匹配优先。(长的最像优先被匹配)
以后缀名结尾的模糊url-pattern优先级最低
servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径
这个缺省的Servlet的作用是用于解析web应用的静态资源文件
1.到当前day10应用下的web.xml文件查找是否有匹配的url-pattern。
2.如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
3.DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件
4.如果找到该文件,则读取该文件内容,返回给浏览器,如果找不到该文件,则返回404错误页面
Servlet程序的生命周期由tomcat服务器控制的
ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
创建时机: 在创建完servlet对象之后,在调用init方法之前创建。
得到对象: 直接从有参数的init方法中得到!!!
context.getRequestDispatcher("路径").forward(request,response);
request.getRequestDispacher("路径").forward(request,response); 等价于上面的代码
得到web应用中的资源文件
context.getRealPath("路径")
context.getResourceAsStream("路径");
context.getContextPath();
request.getContextPath(); 等价于上面的代码
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie的局限:
Cookie只能存字符串类型。不能保存对象
只能存非中文 1个Cookie的容量不超过4KB
如果要保存非字符串,超过4kb内容,只能使用session技术
创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID new HttpSession();
把JSESSIONID作为Cookie的值发送给浏览器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象
getSession(false): 得到session对象。没有匹配的session编号,返回null
void setMaxInactiveInterval(int interval) : 设置session的有效时间
session对象销毁时间:
默认情况30分服务器自动回收
修改session回收时间
全局修改session有效时间
<session-config>
<session-timeout>1</session-timeout>
</session-config>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律