标签:完整 取数据 客户端访问 interval pat load 客户 项目 tin
Sun公司在其API中提供了一个servlet接口,来让开发者开发web资源,通常步骤是:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
下面介绍如何写一个普通的Servlet的实现类。
1.创建一个动态web工程【Servlet是JavaEE的内容,所以需要引用JavaEE的库,不能使用一般的库,所以需要创建动态web工程】:
2.新建一个类,实现Servlet接口:
Servlet接口有几个函数需要实现,destroy(),init(),service(),getServletConfig(),getServletInfo()【后面两个可以忽视,一般不用】
service函数是http请求处理的核心,它有两个分别为ServletRequest和ServletResponse类型的参数,这两个参数由服务器负责封装,request封装了http请求数据,response封装了http请求返回的数据。
(下面讲的HttpServlet本质上还有service,它里面默认会根据http请求的类型来调用不同的方法,比如get类型的就调用doGet),【由于一般不直接实现Servlet,所以这些详细功能的使用留到HttpServlet来讲,这里仅仅做一个例子来讲述请求处理过程】
3.配置Servlet路径匹配,在webContent/WEB-INF/web.xml 【在新版本中,逐渐采用“注解”替代了web.xml的功能。有兴趣的可以自查,我暂时没空去整理。】
配置格式例子如下:
处理过程:
4.运行程序:运行需要tomcat。这里不讲怎么配置tomcat,自己去找吧。https://jingyan.baidu.com/article/fcb5aff74d710bedab4a715f.html
1.全路径匹配,以 / 开始,格式:/匹配目标字符串
例如:/a,/index,/admin
可以有多个/,例如:/a /aa/bb
/a 匹配到 | localhost:8080/项目名称/a |
/admin 匹配到 | localhost:8080/项目名称/admin |
/user/address匹配到 | localhost:8080/项目名称/user/address |
2.模糊路径匹配,以 / 开始 , 以/ * 结束(这里注意,所以/a/*/b不是模糊匹配),格式:/确定的匹配目标字符串/*
*是一个通配符,代表匹配什么都可以!
/a/* 可以匹配到 | localhost:8080/项目名称/a/1001或localhost:8080/项目名称/a/aaa |
/user/super/*可以匹配到 | localhost:8080/项目名称/user/super/001 |
3.扩展名匹配,没有/ ,以 * 开始,格式:*.扩展名
*.扩展名就是前面的路径是什么,但只要.扩展名结尾的都可以匹配成功
*.jpg 可以匹配到 | localhost:8080/项目名称/a/1.jpg或localhost:8080/项目名称/b/2.jpg |
默认匹配:tomcat默认有个匹配,<url-pattern>/</url-pattern>,它是用来匹配静态资源的。
匹配优先级:精确匹配>路径匹配>扩展名匹配>缺省匹配
注意:
1.继承HttpServlet类.
2.重写函数,get请求类型的会调用doGet,如果要处理get请求就需要重写doGet;post请求类型的会调用doPost,如果要处理post请求就需要重写doPost;默认情况下,doPost会默认调用doGet。【怎么重写下面讲】
3.配置Servlet路径匹配.
4.运行程序.
与Servlet接口中的service函数类似,doGet和doPost函数也有两个参数,它们的类型为HttpServletRequest和HttpServletResponse,下面介绍一下它们。它们本质上和ServletRequest对象和ServletResponse对象是类似的,只是进行了封装。
http请求行信息:
获取请求的方式:request.getMethod() 【可以判断是否来自get方式还是post等方式 】
请求资源 :request.getRequetURI() 或 request.getRequetURL()
请求http协议版本 :request.getProtocol()
http请求头信息:
根据请求头获取请求值 :request.getHeader("名称")
获取所有的请求头名称 :request.getHeaderNames()
实体内容:
获取实体内容数据 :request.getInputStream() 【使用情况一般是文件上传之类的情况,普通的表单内容可以使用下面的getParameter】
表单内容:
表单内容中的中文编码问题:
以字节格式返回:
以字符串格式返回:
设置响应码:response.setStatus()【有些时候可能还需要使用响应码,所以说一下。】
设置响应头:response.setHeader(name,value)
有时候因为客户端和服务端编码不一致会造成乱码,所以需要告诉客户端返回的数据的编码格式(处理中文问题):
转发和重定向:
转发:转发是服务端将客户请求转发给其他servlet。地址栏不会变,过程仅仅发生在服务端。
request.getRequestDispatcher("路径").forward(request, response);【转发会带上之前的请求信息(就是把一个完整的request转发了),转发的目的地只能限于本工程;由于限于本工程,使用相对路径时,可以直接略去工程。】
重定向:重定向是服务端返回一个网页给客户,客户的浏览器将自动跳转到指定网页。地址栏会变。
response.sendRedirect("路径");【转向不限于服务端,所以这个路径可以很随意,连百度都可以;如果使用相对路径,那么必须保留工程】;
在web.xml中,在<servlet>中,格式如下:
获取全局配置参数,类似于ServletConfig中的仅仅一个Servlet范围的参数,ServletContext的初始化参数是全局有效的。
获取web工程中的资源,web应用程序部署到服务器上后,资源的相对位置是变化了的,所以不能使用在web工程中的路径,一般都需要使用ServletContext对象来获取路径
存取数据,servlet间共享数据域对象,如果想在多个servlet中共享数据,可以使用ServletContext对象来存取数据。
获取全局配置参数:
获取web工程中的资源:
用ServletContext对象存取数据,使得servlet间能共享数据【存能存多个,取也能取多个;但注意存的时候同名参数的值会覆盖】:
Cookie cookie=new Cookie("name","value")
response.addCookie(cookie) 【把cookie发给客户端存起来】
获取所有cookie:Cookie[] cookies = request.getCookies();
获取cockie的名字:String cookieName = cookie.getName();
获取cockie的值:String cookieValue = c.getValue();
cookie.setMaxAge(seconds);【单位是秒,默认值是-1代表关闭浏览器就失效】
cookie.setValue(newValue);
cookie.setMaxAge(0);
创建session:request.getSession()
获取session: request.getSession(false) 【默认会做一次判断,根据请求过来的JSESSIONID判断是否已经有对应的session,如果已经有,那么会获取对应的那个,如果没有,那么这个函数是创建的意思。而false代表获取,获取不到就返回null】
在session中存储数据:session.setAttribute(name, value)
获取数据:session.getAttribute(name)
移除数据:
删除指定:session.removeAttribute(name)
删除所有:session.invalidate()
设置session的有效时间:setMaxInactiveInterval(seconds)【默认30分钟】
cookie与session的配合:现在新增的session会默认存储到cookie,但在浏览器关闭之后就会清除,所以关键是给cookie设置生存时间:
从上面可以学到session能用来存储数据和读取数据。除此之外还有一些能够用来存储数据的”数据域“对象。下面对几个经常用来存储数据的”数据域“对象来讲解。
在实际应用中,经常要考虑作用范围来使用不同的数据域对象.比如一些”一次性的,经常需要更新“的数据,一般使用HttpServletRequest来存储,因为它寿命较短,耗费长期资源少。
标签:完整 取数据 客户端访问 interval pat load 客户 项目 tin
原文地址:https://www.cnblogs.com/progor/p/9308017.html