具体请求路径:(经常使用这种,其余的架构师经常使用)html
浏览器请求的地址与当前Servlet中的<url-pattern>中内容彻底一致 以'/'开头
前置请求路径:web
<url-pattern>/abc/*</url-pattern>(例子) '*'是一个通配符,表任意长度字符串
后置请求路径:数组
<url-pattern>*.do</url-pattern>(例子)
通配符请求路径:浏览器
<url-pattern>/*</url-pattern>(全部网址均可访问)
请求路径优先级:具体>前置>通配符>后置tomcat
建立时机:服务器
HttpServletResponse接口:cookie
1. 来自Servlet规范中的接口,实现类由tomcat负责提供 2. 其修饰的对象通常称为"响应对象" 3. 将相关数据写入到响应头和响应体 如何将"英文字符串"写入到响应体 String str="hello"; 从响应对象得到一个"输出流" PrintWriter out =Response.getWriter(); out.write(str); 若是将字符串替换成int 50呢?网页结果是2. out.write()方法只能将"字符串"或"unicode码"写入到响应体 值为50的unicode码对应的字符串"2" 此时换用print()方法.可将任意类型数据写入到响应体中并保持原有类型 String str="明天休息"; out.write(str); 结果显示乱码 浏览器是根据响应头中设置的字符集对接收内容进行解码 在默认状况下响应头的字符集为ISO-8859-1 在得到输出流以前设置响应头中字符集 String str="下课休息"; response.setCharacterEncoding("GBK"); response.getWriter().writer(str); String str="apple<br/>oranger<br/>egg"; 通常浏览器默认状况下响应头中[内容类型]是test 设置响应头内容类型 response.setcontentType("text/html;charset=GBK"); 写一个Servlet用来经过JDBC查询表,并把表信息写入到响应体中
HttpServletRequest接口:session
其修饰对象request,称为响应对象.可读取请求协议包相关信息,相似于Scanner request.getRequestURL();获取请求地址 request.getMethod();获取请求方法 request.getParameterNames();获取请求头(体)中的请求参数名 request.getParameter("请求参数名");返回一个字符串(单个请求参数) request.getParameterValues("请求参数名");返回一个数组(多个同名参数)复选框做为参数时
当浏览器以Get方式发送请求时,请求参数存放在请求头,在请求协议包到达服务端时,请求头的内容由Tomcat解析,Tomcat9.0在解析数据时,默认采用的字符集是utf-8.此时浏览器发送的中文参数不会再服务端出现乱码问题
以Post方式发送请求时,请求参数存放在请求体中,到达服务端时由对应的请求对象负责解析,request对象默认使用ISO-8859-1字符集,此时请求出现中文字符会出现乱码问题
方案:在request对象解析数据前,从新设置使用字符集
request.setCharacterEncoding("utf-8");
String value=request.getParameter("参数");架构
ServletContext接口并发
1.servlet规范中的一个接口,接口实现类由Tomcat负责提供 2.为当前工程中的全部servlet提供共享数据 3.习惯将其修饰对象称为全局做用域对象 在Tomcat启动时, 由其建立全局做用域对象,一个网站只能有一个全局做用域对象,当网站关闭时,由Tomcat负责销毁 向Tomcat索要当前工程的全局做用域对象 ServletContext application = request.getServletContext(); 共享数据的来源 1.开发人员添加到web.xml中 <context-param> <param-name>共享数据名称</param-name> <param-value>共享数据内容</param-value> </context-patam> 共享数据内容=application.getInitParameter("共享数据名称"); 此时共享数据只能读取,不能修改. 2.由某个servlet将数据写入全局做用域对象中,其余servlet可使用 写入:application.serAttribute("共享数据名",共享数据内容); 数据可任意类型 获取:application.getAttribute("共享数据名"); 此时servlet的数据能够被修改,一样使用setAttribute将共享数据名覆盖便可
浏览器和服务端一次完整的交流
特色:
1. 一次会话经历屡次请求和响应 2. 一次会话访问多个不一样的servlet
cookie 和 HttpSession
Cookie
是servlet规范提供的一个工具类 在参与一次会话的servlet之间实现数据共享 Cookie存储在浏览器上,保存本次会话的共享数据 原理:(A和B均表明不一样的servlet) 浏览器访问A时,A负责将数据保存到cookie,再有response响应到浏览器,当浏览器再访问B时,须要无条件将已存在的cookie推送给B,这样A和B之间就实现了数据共享 Cookie的使用:一个cookie只能存储一个键值对,并只能存储String类型数据 建立 Cookie c1=new Cookie("key","value"); 写入 response.addCookie(c1); 读取 Cookie array[]=request.getCookies(); cookie.getName();读取关键字 cookie.getValue();读取数据内容 生命周期: cookie是存储在浏览器中的,因此通常状况下,浏览器关闭时,cookie会被销毁 人工干预存活时间: cookie.setMaxAge(以秒为单位);设定cookie在硬盘上存活的时间
HttpSession
来自servlet规范的一个接口,实现类来自Tomcat 其修饰对象为会话做用域对象,或session对象 与cookie的区别: cookie存储在客户端的浏览器或硬盘当中, session存储在服务端的内存中 cookie只能存储String数据 session能够存储任意类型的数据 一个cookie只能存储一个键值对 一个session能够存储任意数量的键值对 使用: 浏览器来访时,Tomcat不会主动建立相应的HttpSession对象,须要servlet提出要求 HttpSession session=request.getSession(); HttpSession session=request.getSession(true); 若当前浏览器在服务端已有一个session对象,Tomcat将此session返回,若没有则新建一个session对象返回(如来访用户身份已获得确认) HttpSession session=request.getSession(false); 如有则返回,若没有则返回null(当用户身份未获得确认) session.setAttribute("key",共享数据); session.getAttribute("key"); 原理: 在Tomcat建立了一个SESSION对象时,为SESSION对象生成一个惟一编号而后将这个编号保存到cookie中,推送到当前的浏览器内存中 等到浏览器再次发送请求时,Tomcat就能够经过读取浏览器返回的cookie来判断浏览器在服务端中是否有session对象
Http状态码
Http状态码通知浏览器在收到响应包以后的行为,及告知浏览器,服务端没法提供本次服务的缘由 1xx:通知浏览器本次返回资源文件并不完整,须要浏览器向服务端再次发送请求 2xx:传送文件完整 200:正常状态码,浏览器和服务端进行了一次完美的通讯 3xx:服务器给浏览器推送的是一个网址,浏览器在接收到该网址后要马上向该网址发送请求 response.sendRedirect("地址"); 4xx:通知浏览器,服务端没法提供本次服务的缘由,是因为服务端没有相应资源 400:服务端没有相应的资源 405:服务端有处理本次请求的servlet,但该servlet不支持当前浏览器的请求方式.如浏览器已get方式请求服务端,但相应servlet没有重写doGet方法. 5xx:通知浏览器,服务端未能提供本次服务的缘由,是被调用servlet在运行时出现了异常
默认欢迎资源文件
浏览器向服务器发送了默认请求,没有指定索要的文件的时候 http://localhose/555 手动在web.xml配置 <welcome-file-list> <welcome-file>one.html</welcome-file> </welcome-file-list> 当web.xml文件中没有的时候 Tomcat回到本身的config文件下有个web.xml文件,里面写的有默认的文件名
1.重定向方案
在第一个servlet工做完毕后,将第二个servlet的地址发给浏览器,浏览器自动请求第二个servlet response.sendRedirect(第二个servlet的地址) 发生位置:客户端浏览器上,请求屡次,地址栏内容会发生改变,请求方式必定是get,可访问内网和外网的资源 适用场景:添加,删除,更新后调用查询功能
2.请求转发方案
第一个servlet工做完毕后,代替浏览器向Tomcat申请调用第二个servlet 1.建立一个资源申请报告对象 RequestDispatcher report=request.getRequestDispatcher("第二个servlet的地址") 2.将申请报告推送给Tomcat,并将第一个servlet的response和request一并发送 report.forward(request,response) 请求转发时为何将第一个Servelt中request和response交给Tomcat: Tomcat在调用第二个Serelt时须要为其提供运行时须要【request】和【response】 可是,本次请求是由第一个Servelt来发送的,没有对应的【请求协议包】 所以致使Tomcat在接受到请求后,不会建立【request】和【response】, 为了解决这个问题,须要将第一个Servlet的request和response交给第二个Servlet来使用。 发生位置在服务端,浏览器只向服务器发送了一次请求,只能访问内部的资源,请求方式始终和第一个servlet保持一致 适用于查询servlet调用jsp