Servlet_1_基本知识
Servlet是一个接口,当一个类实现了此接口,便会被服务器识别。
在服务器收到客服端的请求后,会根据请求地址action,找到目标的servlet类进行响应。
一、请求与响应流程
1、客户端(浏览器)发起请求到服务器。
2、服务器接受请求,进行解析,创建request对象存储请求数据。
3、服务器调用对应的Servlet进行请求处理,并将request对象作为实参传递给Servlet的方法。
4、Servlet的方法对请求进行处理,并通过response对象将响应数据传给客服端。
二、Servlet类介绍
一个类继承了HttpServlet后,则成为一个Servlet服务。1、Servlet常用方法:
预处理,第一次被请求的时候,会先执行init方法。
@Override public void init() throws ServletException { super.init(); }
服务器关闭的时候,会执行destory方法。
@Override public void destroy() { super.destroy(); }
处理请求:
1、doGet方法,只会处理get方式提交的请求。
2、doPost方法,只会处理post方式提交的请求。
3、service方法,会处理get或post提交方式的请求。(优先调用)
2、处理请求步骤
(1)设置请求编码格式,如果是get方式,参考Servlet中设置请求和响应的编码格式
req.setCharacterEncoding("utf-8");
(2)设置响应编码格式
resp.setContentType("text/html; charset=UTF-8");
(3)获取请求信息,注意,获取不存在的name值不会报错,会取到null。
//获取表单中name值为u_name的值 String u_name = req.getParameter("u_name"); //获取表单中所有name值为favs的值的 String 对象数组 String u_pwd = req.getParameterValues("favs");
(4)处理请求信息
创建业务层对象
调用业务层对象的方法
(5)响应处理结果
直接响应
请求转发:把请求转发到指定的servlet去,此时的req对象为共享的,可以携带数据,通过set/getAttribute(key,value)
//把请求转发到指定servlet req.getRequestDispatcher("Servlet别名").forward(req,resp); return ;
重定向:告知浏览器重发一个请求到指定的servlet
//为了避免servlet的别名中包含目录导致的使用先对路径查找资源失败 //建议使用绝对路径:/项目别名/资源路径 resp.sendRedirect("/项目别名/Servlet路径"); return ;
三、调用Servlet方式
客服端指定(action)对哪个servlet做出请求,则服务器调用目标servlet类进行处理请求。
1、默认开启的服务
在项目的web.xml中,的对应的servlet标签中配置
<!--项目启动后第一个调用此服务--> <load-on-startup>1</load-on-startup>
2、通过客服端请求开启的服务
提交表单、超链接、......
四、请求数据的保存
1、保存在浏览器(Cookie)
将数据储存在cookie中,使其保存在浏览器中,案例:三天免登录。
新建:
//新建cookie对象 Cookie cookie = new Cookie("u_uid",""+u.getU_uid()); //设置有效期,秒数,三天,默认是关闭浏览器即失效 cookie.setMaxAge(3*24*60*60); //设置有效路径,默认是项目下所有servlet cookie.setPath("/servlet_war_exploded/ck"); //响应给浏览器 resp.addCookie(cookie);
获取:
//获取cookie信息数组 Cookie[] cookies = req.getCookies(); //遍历获取Cookie信息 if(cookies!=null){ for (Cookie cookie:cookies){ //获取键 cookie.getName(); //获取值 cookie.getValue(); } }
2、保存在服务器中(session)
把请求信息保存在服务器的session对象中,浏览器通过cookie中的JSESSIONID进行访问,案例:同一个web应用中,用户的不同请求。
使用:
//如果请求中拥有session标识符JSESSIONID,则获取到对应的session对象。 //如果请求中没有JSESSIONID,则创建一个session对象,并把它作为cookie传递给浏览器。 //如果请求中的JSESSIONID已经失效,则新建一个session对象,并把它作为cookie传递给浏览器。 HttpSession hs = req.getSession();
//设置服务器中session储存时间(秒),一天,默认30分钟,可在web.xml中进行配置默认时间。 hs.setMaxInactiveInterval(24*60*60);
//销毁服务器中的session hs.invalidate();
//储存信息 hs.setAttribute("name","lurenjia"); //获取信息 hs.getAttribute("name");
五、ServletContext对象
它是由服务器创建的,所有用户共享的一个对象。(单例模式)
获取:
//获取方式一 ServletContext sc = this.getServletContext(); //获取方式二 ServletContext sc2 = req.getServletContext(); //获取方式三 ServletContext sc3 = this.getServletConfig().getServletContext();
1、数据共享:
可以实现多用户数据共享。
//储存数据 sc.setAttribute("name","lurenjia"); //获取数据 sc.getAttribute("name");
2、获取项目web.xml中的param配置(全局)
在web.xml中,给webapp标签添加子标签:
<context-param> <!--键--> <param-name>name</param-name> <!--值--> <param-value>name_lurenjia</param-value>> </context-param>
使用ServletContext获取
//通过键名获取值 String value = sc.getInitParameter("name"); //获取键名,迭代器对象 Enumeration<String> names = sc.getInitParameterNames(); //遍历值 while (names.hasMoreElements()){ System.out.println(sc.getInitParameter(names.nextElement())); }
3、获取项目根目录下资源的绝对路径
//获取项目根目录下的资源路径 String path = sc.getRealPath("/doc/1.txt");
4、获取项目根目录下资源的流对象
//获取项目根目录下的资源的流对象 InputStream is = sc.getResourceAsStream("/doc/1.txt");
六、ServletConfig对象
每个Servlet对象都单独拥有一个ServletConfig对象,用来获取web.xml中自己的param配置。
1、xml中,给servlet标签配置子标签
<init-param> <param-name>love</param-name> <param-value>is you</param-value> </init-param>
2、使用ServletConfig获取
//通过键名获取值 String value = sc.getInitParameter("name"); //获取键名,迭代器对象 Enumeration<String> names = sc.getInitParameterNames(); //遍历值 while (names.hasMoreElements()){ System.out.println(sc.getInitParameter(names.nextElement())); }