码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet学习

时间:2021-06-13 10:25:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ali   racket   fresh   ini   不能   缓存   conf   cal   dog   

 

//在idea中修改了Servlet中的代码之后,需重启服务器,输出的才是修改之后的结果;不重启,输入相同的网址,结果依然是修改之前的

//通过网址,即url-pattern访问其对应的Servlet实现类,服务器会自动调用该实现类的service方法,不会调用执行其他的,若当前Servlet没有service()方法,则执行其父类的service()方法

 

ServletConfig接口

<servlet>
   <servlet-name>SomeServlet</servlet-name>
   <servlet-class>com.dh.SomeServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
   <init-param>
       <param-name>...</param-name>
       <param-value>...</param-value>
   </init-param>
  ......
</servlet>

//该接口封装的就是web.xml配置文件中的以上部分,该接口的对象就可对<servlet>标签中的元素进行操作

 

 

ServletContext接口

<web-app>
   <context-param>
       <param-name>name</param-name>
       <param-value>pz</param-value>
   </context-param>
</web-app>

//一个webapp中只能有一个ServletContext对象,该对象在服务器启动阶段被实例化,在服务器关闭时被销毁,所有的Servlet对象共享一个ServletCongtext对象,其可以实现跨用户传递数据。该对象中的数据不建议修改,可能有线程安全问题。以上部分就是该对象存储的数据在web.xml文件中的展示

 

 

HttpServletRequest接口

//HttpServletRequst接口的对象封装的是HTTP的请求协议(包含请求行,请求报头,空白行,请求主体)中的全部信息;

//一般其变量名为request。HttpServletRequest对象代表一次请求,一次请求对应一个request对象,一百个请求代表一百个request对象。

//request对象中的数据是以Map集合的方式存储的,Map<String,String[]>,其value值是一个一维数组。

//ServletRequest是其父接口

 

 

常用方法1(获取表单中的数据)

  1. //通过key获得value代表的一维数组中的首元素

String getParameter(String name)
  1. //通过key获得该一维数组中的所有值

String getParamterValues(String name)
  1. //获取整个map集合

Map getParemterMap()
  1. //获取map集合中所有的key

Enumeration getParemterNames()

 

常用方法2

  1. //获取上下文路径,即webapp的根路径

String getContextPath()
  1. //获取浏览器的请求方式

String getMethod()
  1. //获取URI

String getRequestURI()
  1. //获取URL

StringBuffer getRequestURL()
  1. //获取servlet path,即url-pattern

String getServletPath()
  1. //获得客户端的IP地址,即访问者的IP

String getRemoteAddr()

 

常用方法3

  1. //在request范围内存储数据

void setAttribute(String name,Object o)
  1. //从request范围内取出数据

Object getAttribute(String name)
  1. //移除request范围中的数据

void removeAttribute(String name)

//ServletContext和HttpServletRequest接口中都有以上3个方法,区别只在于作用范围不一样。一个是应用范围的,一个是请求范围,ServletContext可以跨用户传递数据,ServletReqest不能跨用户,但可以跨Servlet

//getAttribute()方法只能取出setAttribute()存进去的数据;getParameter(String name)取出的是表单中的数据

 

常用方法4(跳转)

  1. //获得请求转发器

RequestDispatcher getRquestDispatcher(String path)
  1. //调用转发器的forward方法

转发器对象.forward(request,response)

 

  • //重定向(地址栏会发生改变)

response.sendRedirect(request.getContextPath() + String path)

//路径要比forward多一个应用名

//从一个Servlet重定向到另一个Servlet是以get请求的方式,后面一个Servlet必须重写doGet方法才可以,若是重写doPost方法,则系统报错

 

 

 

解决字符在传递过程中的乱码问题

技术图片

//以上是两种方式:一种是专门针对post请求的,一种是万能的,那种请求都可以;而专门针对get请求的需要修改

Tomcat/conf/sever.xml文件,以上不展示

 

 

 

 

Cookie

//Cookie是用来保存会话状态,存储在浏览器中的

//但Cookie是由服务器创建的,而非浏览器

 

常用方法

  1. //在java中创建Cookie

Cookie c=new Cookie(String name,String value)

 

  1. //绑定发送给服务器的路径

c.setPath(String path)

//path为相对路径,如:/myweb/xxx,参照路径为web服务器的根路径,即http://localhost:8080/

//不绑定,默认情况下,若<url-pattern>为:myweb/a/b,则会默认与a/绑定,只要有这个路径,就会把Cookie发送给服务器

 

  1. //设置Cookie的有效时长

c.setMaxAge(60*60)                //1小时有效

//Cookie的有效时长=0 :直接删除,相当于时间到了,失效

//Cookie的有效时长>0 :不会被存储

//Cookie的有效时长<0 :存储在浏览器的硬盘文件中

//若没有设置有效时长,则Cookie会被存在浏览器的缓存中,该浏览器一关闭,Cookie就失效

 

  1. //将Cookie对象传给浏览器

response.addCookie(c)

 

  1. //服务器中获取浏览器提交的Cookie

Cookie[] cookies=request.getCookie()

//当Cookies的值为null时,证明浏览器没有提交Cookie

 

 

 

 

HttpSession接口

 

Session原理

1.打开浏览器,在浏览器上发送第一次请求给服务器

2.服务器会创建一个session对象,该对象代表一次会话

3.同时会生成该session对象对应的Cookie对象,并且Cookie对象的name为 JSESSIONID,value是32位长度的字符串(全球唯一性)

4.服务器会建立一个session列表(底层是Map集合),Map集合的key是Cookie的value,Map的value是session对象,将两者绑定在一起

5.最后服务器再将完整的Cookie发送给浏览器

6.浏览器将Cookie保存在缓存中(除非设置Cookie的有效时长,才能将其保存在浏览器的硬盘中)

7.浏览器不关闭,该Cookie不会消失

8.当再次发送请求时,会自动提交缓存中的Cookie

9.服务器接收到Cookie,验证到该Cookie的name为JSESSIONID,则知道这个Cookie是来找session对象的,然后获取该Cookie的value值

10.通过Cookie的value值去session列表中检索对应的session对象

 

 

 

常用方法1

  1. //获取当前会话的Session对象

HttpSession s=request.getSession();

 

  1. //向Session对象中存储数据

s.setAttribure(String name,Object value);

 

  1. //从会话范围中取出数据

Object o = s.getAttribute(String name);

 

  1. //删除会话范围中的数据

void removeAttribute(String name)

 

  1. //销毁Session对象

void invalidate()

 

 

常用方法2

  1. //获取当前Session对象,获取不到,就新建一个Session对象

HttpSession s=request.getSession();

 

  1. //获取当前Session对象,获取不到,就新建一个Session对象

HttpSession s=request.getSession(true);

 

  1. //获取当前Session对象,获取不到,则返回null

HttpSession s=request.getSession(false);

 

 

设置Session对象的超时时间

//在web.xml文件中配置,默认是30分钟

<web-app>
   <session-config>
       <session-timeout>120</session-timeout>
   </session-config>
</web-app>

//以上设置的是120分钟,若在120分钟内,没有用户再访问该Session对象,则销毁回收该对象;若期间有用户访问该对象,则重新开始计时,再等120分钟,若还有访问,就再重新计时,以此类推

 

 

三个范围对象

  • ServletContext application 应用范围

  • HttpSession session 会话范围

  • HttpServletRequest request 请求范围

//application完成跨会话传递数据;可以浅显认为应用范围即只要不关闭重启服务器,就再同一个应用中

//session完成跨请求共享数据,但这些请求必须在同一个会话中;浅显的可以认为只要不关闭浏览器,就再同一个会话当中;不同浏览器是不同的会话。但本质上一次会话是从Session对象从创建,到最终超时销毁的过程

//request完成跨Servlet共享数据。但这些Servlet必须在同一个请求中(转发:forward)。跨Servlet实际上就是跨Servlet接口的实现类

//一次请求可以浅显的理解为:在浏览器地址上输入一个网址,查询,但中间不能发生重定向,即查询结果出来之后,浏览器地址栏的地址不能改变,可视为一次请求

 

 

 

Servlet学习

标签:ali   racket   fresh   ini   不能   缓存   conf   cal   dog   

原文地址:https://www.cnblogs.com/zhestudy-2021/p/14878626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!