Servlet简介:
狭义的servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet的类。其主要功能在与交互式的浏览和修改数据,生成动态Web内容。
Servlet生命周期:
有两个方法:init () 和 destroy()。
如果不再配置文件加 load-on-startup 那么初始化方法会在第一次调用的时候启动,直到服务器关闭。
如果加了 oad-on-startup 那么服务器一旦启动init方法就会被执行,那么生命周期就是从服务器启动到服务器关闭。
init() 他是一个初始化方法,方法会在servlet加载进内存时就被执行,destroy() 会在服务器关闭的时候被执行。
Service & doGet & doPost方法:
service() 方法:可以处理 get 和 post 两种请求方法。
doGet() 方法:处理get请求方式。
doPost() 方法:处理post请求方式。
注意:如果在service方法中有调用 super.service(arg0, arg1); 这句话,那么在你的这个类中就必须有 doGet() 方法 和 doPost() 方法否则就会报错。
我们一般用的比较多的就是service()方法,原因就很清楚了,因为它既可以处理get请求也可以处理post请求。那么我们就来写一个简单的Servlet程序,其实比较简单,首先我们创建一个类去继承HttpServlet,然后重写里面的service方法,
public class A extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.getWriter().write("adada"); //打印到浏览器
System.out.println("aa"); //在服务器打印
}
}
我们可以看到里面有两个参数,一个是request对象,一个是responce对象,这两个对象重它的意思就可以大概理解,request对象是存储用户信息的,我们可以通过一些方法来获取用户信息,比如说响应头,获取请求方式,获取url,uri,获取协议等等。下面举出一些l例子:
//request对象由服务器创建
//获取请求方式
String method = request.getMethod();
System.out.println(method);
//获取请求url
StringBuffer url = request.getRequestURL();
//获取URI,相对路劲
String uri = request.getRequestURI();
//获取协议
String h = request.getScheme();
System.out.println(h);
//获取指定请求行数据
String value = request.getHeader("aa");
//获取所有请求行的键的枚举
Enumeration e = request.getAttributeNames();
while(e.hasMoreElements()){
System.out.println(e.nextElement());
}
responce就是响应给用户的一些数据,比如说设置响应头,往浏览器中写入一些数据:
responce.setHeader("ss", "ads");//响应头中,设置键
responce.setHeader("a", "a");//添加
responce.setHeader("content-type", "text/html;charset=utf-8");
//设置响应状态码
//responce.sendError(404,"asdasdsadsa");
//设置响应实体
responce.getWriter().write("this is st");
需要注意的是,service方法我们并没有在那个函数调用,我们也没去写主函数,service方法是由浏览器发去请求后,由服务器调用起来的。
简单的介绍了这两个参数之后我们就来以一个我在学习中实际做的一个小练习来进一步熟悉它的用法,做法就是首先在浏览器想要由一个登录页面。
就比如上面这个图,如果你了解过html那么我想你可以分分钟搞定;
protected void service(HttpServletRequest request, HttpServletResponse responce)
throws ServletException, IOException {
// TODO Auto-generated method stub
//获取request对象作用域
String str = (String)request.getAttribute("str");//设置请求编码格式
responce.setContentType("text/html;charset=utf-8");//设置响应编码格式
responce.getWriter().write("");//往浏览器写数据
responce.getWriter().write("");
responce.getWriter().write("");
responce.getWriter().write("");
responce.getWriter().write("");
responce.getWriter().write("");
responce.getWriter().write("");
}
这种是写起来是比较麻烦的,后面会介绍JSP技术,它完美的解决了这一问题,但是原理是一样的。这样我们打开服务器去访问该页面那么就会出现该登录页面了。
那么我们如果想实现真正的一个登录系统可以实现吗?答案是可以的。我们实现的是当用户输入姓名和密码之后,去数据库核对信息,如果核对无误那么就登录一个主页面,效果如下。
这里我首先先介绍session和Cookie。
Cookie是一门浏览器端的存储技术,分为临时存储和定时存储,如果只是临时存储那么那就存储在浏览器的运行内存中,浏览器关闭数据丢失,如果是定时存储那么就是存储在硬盘中,在规定时间内数据一直存储在硬盘中。
所谓临时存储就是你不给他设置有效时间,默认的存储方式。
//设置请求编码
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//创建cookie
Cookie c = new Cookie("mouse", "lenovo");
//添加cookie
resp.addCookie(c);
定时存储:
//设置请求编码
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//创建cookie
Cookie c = new Cookie("mouse", "lenovo");
//设置cookie
/**
* 如果不设置,数据是存储在浏览器的运行内存中的
* 如果设置了Cookie有效期,存储在了硬盘中。
* 存储在客户端
* 默认Cooike信息存储好之后,每次请求都会附带,除非设置有效路径。
* */
c.setMaxAge(3*24*3600);//设置cookie存储期限
c.setPath("/gc");//设置有效路径
//添加cookie
resp.addCookie(c);
//Cookie获取
resp.getWriter().write("hello cookie");
获取cookie:
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//返回的是数组,因为有时候cookie不止一个
Cookie[] ck = req.getCookies();
if(ck != null){
//遍历数组并获取其内容
for(Cookie c : ck){
String key = c.getName();
String value = c.getValue();
System.out.println(key+":"+value);
}
}
代码都比较简单,并且由必要注释我就不一一解释了。
Session是服务器端的一门存储技术,它用于同一用户的不同请求,什么是统一用户不同的请求,就比如说我们登录的这个例子,你的登录页面肯定是一次请求,那么当你跳到另一个页面也就是主页面,肯定又是另外一个请求,那么如何实现?其实这也有依赖Cookie,用户第一次访问服务器,服务器会创建一个session对象给此用户,并且将session对象的JSESSIONID使用Cookie技术存储到浏览器,保证同一用户的其它请求能够获得同一个请求,也保证了不同请求能够获得共享数据,。
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//如果有Session就获取没有则创建
//设置存储时间hs.setMaxInactiveInterval(arg0)
//强制失效hs.invalidate()
HttpSession hs = req.getSession();
还需要说的ServletContext,它是一个不同用户不同请求的数据共享问题。
ServletContext sc = this.getServletContext();
ServletContext sc1 = req.getSession().getServletContext();
ServletContext sc2 = this.getServletConfig().getServletContext();
/*这三种方式都可以拿到ServletContext对象,而且都显示同一个*/
System.out.println(sc==sc1);//true
//数据的存取
sc.setAttribute("str", "ServletContext对象的学习");
/**可以用ServletContext对象来获取web.xml的全局配置
* 它具体有什么作用?可以进行代码间静态数据的解耦
* */
String s = sc.getInitParameter("全局参数");
System.out.println(s);
/*可以使用ServletContext对象来获取项目的绝对路径:D:\Garbige\apache-tomcat-8.5.47\webapps\Project\WrbRoot\WEB-INF\web.xml
*
*/
String path = sc.getRealPath("/WrbRoot/WEB-INF/web.xml");
System.out.println(path);
//还可以获取文件夹下的输入流,calss文件不行必须用类加载器
//InputStream is = sc.getResourceAsStream("");
servletConfig:比较简单,就是可以获取配置文件的局部配置。
整个练习的项目代码我都放在GitHub,https://github.com/xhl123456789/-,需要进一步了解的可以自行下载哦。有问题欢迎联系:qq:1659444572