1.servlet基本概念
2.ServletConfig
3.ServletContext
4.response
5.request
6.请求转发和请求重定向区别
1.servlet基本概念:动态web开发技术
(1).Servlet调用过程
输入网址==>查找本地hosts==>如果没有就查找DNS(查到后到服务器端)==>服务器端根据请求头分析请求的是哪个虚拟主机==>再分析请求的是虚拟主机下的哪个web应用==>再分析需要web应用下的什么资源==>根据web.xml查找到资源==>写入到response对象里组织成相应消息传给浏览器
(2).Servlet生命周期
Servlet第一次访问创建Servlet对象,调用init()方法。后来每次访问,调用service()方法。当应用移除或者服务器关闭,Servlet对象销毁,调用destroy()方法。
(3).Servlet的继承接口:
Servlet==>GenericServlet==>HttpServlet
(4).Servlet的一些细节:
^1:一个
^2:
第一:/aa/bb/*,即*写在地址最后面
第二:*.后缀
注:如果一个地址匹配多个,和哪个最像用哪个。但是*.后缀的优先级最低
^3:
注:400,500页面,静态资源的访问都是靠的缺省Servlet
^4:Servlet中
^5:Servlet存在线程安全问题,解决办法就是加锁
2.ServletConfig:配置信息对象
getServletName():获取当前servlet在web.xml中的名称
getInitParameter(String name):获取指定名称的初始化参数
getInitParameterNames():获取所有初始化参数的名字
getServletContext():获取ServletContext对象
3.ServletContext:代表当前web对象
(1).作为域对象在整个web应用中被共享
域对象:在指定的域范围内该对象的内容可以被共享
生命周期:服务器启动web应用创建ServletContext,web应用被移除或者服务器关闭ServletContext对象被销毁。
setAttribute(String attr,Object obj);
getAttribute(String attr);
removeAttribute(String attr);
(2).获取参数
getInitPatameter():获取初始化参数
getParameter(String para):获取请求参数
getAttribute(String attr):获取域对象的键值对
(3).请求转发
RequestDispatcher dispatcher = this.getServletContext.getRequestDispatcher("/servlet2");
dispatcher.forward(req,resp);
(4).加载资源文件
this.getServletContext.getRealPath("文件名");
具体写法(2种):
^1:(servlet下)
Properties prop = new Properties();
prop.load(new FileReader(this.getServletContext.getRealPath("config.properties")));
^2:(非servlet,用类加载器)
Properties prop = new Properties();
prop.load(new FileReader(Service.class.getClassLoader.getResource("config.properties").getPath()));
4.response:响应浏览器的对象
(1).解决编码问题:
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
(2).文件下载
resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("啊啊啊.jpg","utf-8"));
(3).定时刷新
resp.setHeader("Refresh","3;url=/test/1.html");
注:也可以在前台设定定时刷新:
(4).缓存
设置不要缓存:
resp.setIntHeader("Expires","-1");
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
设置缓存时间:
resp.setDateHeader("Expires",System.getCurrentMillis+3600*24);
(5).请求重定向
resp.sendRedirect("/test/1.html");
(6).Servlet的service()方法结束后,如果getWriter()和getOutputStream()方法没有关闭,就会后台自己调用关闭掉。
5.request:浏览器请求的对象
(1).获取客户机信息
getRequestURL():获取URL
getRequestURI():获取URI
getRemoteAddr():获取IP
getContextPath():获取web应用虚拟目录地址
getQueryString():获取请求行信息
getMethod():获取请求方式
(2).获取请求行参数
getHeader(String name);
getIntHeader(String name);
getDateHeader(String name);
getHeaders(String name);
getHeaderNames();
(3).请求参数乱码设置
get方法:req.setCharacterEncoding("utf-8");
post方法:String str = new String(req.getParameter("username").getBytes("iso8859-1"),"utf-8");
(4).作为域对象
^1.作用范围:整个请求链
^2.生命周期:服务器收到请求,创建Request开始;请求结束,Request销毁
setAttribute(String attr,Object obj);
getAttribute(String attr);
remove(String attr);
^3.请求转发:
req.getRequestDispatcher("地址").forward(req,resp);
this.getServletContext.getRequestDispatcher("地址").forward(req,resp);
^4.请求包含(将两个资源合并后输出)
req.getRequestDispatcher("地址").include(req,resp);
this.getServletContext.getRequestDispatcher("地址").include(req,resp);
6.请求转发和请求重定向区别
请求转发:一次请求一次响应,不改变地址栏信息
请求重定向:两次请求两次响应,改变地址栏
注:需要用到request域传递属性,用请求转发
如果两者都可以用,建议用请求转发,节省资源