跳至主要內容

web

HeChuangJun约 3199 字大约 11 分钟

web

1. WEB三大规范

  • servlet、filter、listener
  • request客户端发送的参数 到服务器端都是字符串

2. javax.servlet.Servlet servlet

  • 用于获取请求数据、处理请求、完成响应
  • 使用servlet可以实现servlet接口并配置web.xml,但是不推荐
  • init(ServletConfig config);//servlet对象创建的时候执行ServletConfig:代表的是该servlet对象的配置信息
  • service(ServletRequest request,ServletResponse response);//每次请求都会执行
  • destroy();//servlet销毁的时候执行

3. javax.servlet.http.HttpServlet

  • 使用servlet可以继承HttpServlet并复写HttpServlet类的doGet、doPost方法并配置web.xml
  • init();//servlet对象创建的时候执行
  • doGet(HttpServletRequest request,HttpServletResponse response);//每次get请求都会执行
  • doPost(HttpServletRequest request,HttpServletResponse response);//每次post请求都会执行
  • destroy();//servlet销毁的时候执行

4. javax.servlet.ServletRequest

5. javax.servlet.http.HttpServletRequest

  • 获得请求行
    • String getContextPath()获得”/“+web应用名称,例如/WEB15_request
    • String getMethod()
    • String getRequestURI()获得相对web应用地址/WEB15_request/line
    • String getRequestURL()获得绝对路径http://localhost:8080/WEB15_request/lineopen in new window
    • String getRemoteAddr()获得访问的客户端IP地址
    • String getQueryString()get提交url地址后的参数字符串username=lisi&password=123
    • String getProtocol();获取请求行中的协议名和版本
    • String getServletPath();
    • String getRemotePort();
    • String getRemoteHost();
    • String getLocalAddr();
    • String getLocalName();
    • String getLocalHost();
    • int getLocalPort();
    • String getServerName();
    • int getServerPort();
    • String getScheme();//获取请求协议名
    • StringBuffer getRequestURL();
  • 获得请求头
    • String getHeader(String name)
    • Enumeration getHeaders(String name)
    • Enumeration getHeaderNames()
    • Long getDateHeader(String name)
    • int getIntHeader(String name)
    • String getContentType()
    • int getContentLength()
    • String getCharacterEncoding()
  • 获得请求体
    • String getParameter(String name) 多个只获得一个,没有则返回null
    • Map<String,String[]> getParameterMap()获得指定参数名对应的所有键值
    • String[] getParameterValues(String name)获得指定参数名对应的所有值(少用)
    • Enumeration getParameterNames()
  • 乱码:浏览器的中文用UTF-8编码,而HTTP协议使用iSO8859-1编码。不同的浏览器接收和发送数据取决于浏览器类型,通过Http请求体中的User-Agent属性可以辨别
    • post乱码 request.setCharacterEncoding("UTF-8");
    • get乱码 String parameter=new String(parameter.getbytes("iso8859-1"),"utf-8");
  • 转发 request.getRequestDispatcher(”/?”).forward(req,resp);
  • 域对象
    • Object setAttribute (String name, Object o)set注意名字相同时则覆盖
    • String getAttribute(String name)
    • void removeAttribute(String name)

6. javax.servlet.ServletResponse

7. javax.servlet.http.HttpServletResponse

  • 设置响应行
    • void setStatus(int sc)
    • void sendError(int sc,[String messge])
  • 设置响应头(值不重复)
    • void addHeader(String name, String value)
    • void setHeader(String name, String value);
  • 设置定时刷新的头:setHeader("refresh", "5;url=http://www.baidu.comopen in new window");
    • void addIntHeader(String name, int value)
    • void setIntHeader(String name, int value)
    • void addDateHeader(String name, long date)
    • void setDateHeader(String name, long date)
    • void setContentLength(int len)
    • void setContentType(String type)
    • void setLocale(Locale loc)
    • void setCharacterEncoding(String charset)
  • 设置响应体
    • getWriter().write("")字符串,可以插入标签
    • getOutputStream().write(byte[] bytes) 因为getWriter()之前已调用getOutputStream(),故两者不能同时使用
    • setHeader("content-Type","text/html;charset=utf-8");中文乱码
    • sendRedirect("/WEB14/servlet2");重定向
    • setStatus(302);setHeader("Location", "/WEB14/servlet2");

8. javax.servlet.ServletContext

  • 获得ServletContext
    • ServletConfig.getServletContext();
    • this.getServletContext();(推荐)
  • 获得web.xml全局的初始化参数 getInitParameter(String name);
  • 域对象(整个web应用)
    • void setAtrribute(String name,Object obj);
    • Object getAttribute(String name);
    • void removeAttribute(String name);
  • WebContext目录内任何资源绝对路径
    • String getRealPath(String path);//:/WEB-INF/
    • InputStream getResourceAsStream(String path); 以/开头path相对WebContext目录InputStream

9. javax.servlet.ServletConfig

  • 获得该servlet在web.xml上的name String getServletName();
  • 获得该servlet的初始化的参数
    • String getInitParameter(String name);
    • Enumeration getInitParameterNames();
  • 获得Servletcontext对象 ServletContext getServletContext();

10. javax.servlet.http.Cookie

  • cookie会以响应头的形式发送给客户端:set-cookie:”name=zhengsan”
  • cookie不能存储中文、它是浏览器缓存的一部分。
  • cookie数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie,有大小和个数的限制
  • 会话级别cookie:不设置cookie会存储在浏览器的内存中,随浏览器关闭销毁
  • 持久级别cookie:设置cookie信息会被持久化到浏览器的磁盘文件里,过期浏览器自动删除
  • 创建CookieCookie cookie = new Cookie(name,value)
  • 持久化时间cookie.setMaxAge(秒);
  • 请求时cookie被携带路径
    • cookie.setPath();不设置,cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息,会覆盖
    • cookie.setPath("/WEB");访问WEB应用中的任何资源都携带cookie
    • cookie.setPath("/WEB/cookieServlet");访问WEB16中的cookieServlet时才携带cookie信息
    • cookie.setPath("/");代表访问tomcat下所有的web项目的cookie信息
  • 向客户端发送cookie response.addCookie(Cookie cookie);//如果路径和名称一样,两次add会覆盖
  • 获得客户端的cookie Cookie[] cookies = request.getCookies();
  • 获得cookie的键值 cookie.getName();cookie.getValue();
  • 删除cookie
    • Cookie cookie = new Cookie("name","");//将cookie的name设置与删除的cookie一致
    • cookie.setPath("/WEB16");//将path设置成与要删除cookie的path一致
    • cookie.setMaxAge(0);//设置时间是0;
    • response.addCookie(cookie);

11. javax.servlet.http.HttpSession

  • session将数据存储到服务器端,安全性相对好,增加服务器的压力,没有大小和个数限制
  • session会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。
  • 所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID来辨别是哪个客户端
  • 获得Session request.getSession([boolean create])
  • 获得sessionid String getId()
  • 设置session空闲时间 void setMaxInactiveInterval(int interval)
  • 获得servletcontext ServletContext getServletContext()
  • session域
    • void setAttribute(String name,Object obj);
    • Object getAttribute(String name);
    • void removeAttribute(String name);
  • 销毁session void invalidate();

12. java.util.EventListener

13. javax.servlet.ServletContextListener

  • contextInitialized(ServlertContextEvent sre)
  • contextDestroyed(ServlertContextEvent sre)
  • ServletContext context = ServlertContextEvent.getServletContext();
    • ①初始化:对象、数据、加载数据库驱动,连接池的初始化
    • ②加载一些初始化的配置文件 --- spring的配置文件
    • ③任务调度----定时器----Timer/TimerTask
    • 需要web.xml注册

14. javax.servlet.http.HttpSessionListener

  • sessionCreated(HttpSessionEvent se);
  • sessionDestroyed(HttpSessionEvent se);
  • Session session = HttpSessionEvent.getSession();
  • 需要web.xml注册

15. javax.servlet.ServletRequestListener

  • requestInitialized(ServlertRequestEvent sre);
  • requestDestroyed(ServlertRequestEvent sre);
  • ServletContext context = ServlertRequestEvent.getServletContext();
  • ServlertReque request = ServlertRequestEvent.getServletRequest();
  • 需要web.xml注册

16. javax.servlet.ServletContextAttributeListener

  • attributeAdded(ServletContextAttributeEvent event);
  • attributeRemoved(ServletContextAttributeEvent event);
  • attributeReplaced(ServletContextAttributeEvent event);
  • String name = ServletContextAttributeEvent.getName()
  • String value = ServletContextAttributeEvent.getValue()
  • SevletContext context = ServletContextAttributeEvent.getSevletContext()
  • 需要web.xml注册

17. javax.servlet.http.HttpSessionAttributeListener

  • attributeAdded(HttpSessionBindingEvent event);
  • attributeRemoved(HttpSessionBindingEvent event);
  • attributeReplaced(HttpSessionBindingEvent event);
  • String name = HttpSessionBindingEvent.getName()
  • String value = HttpSessionBindingEvent.getValue()
  • Session session = HttpSessionBindingEvent.getSession()
  • 需要web.xml注册

18. javax.servlet.ServletRequestAttributeListener

  • attributeAdded(ServletRequestAttributEvent srae);
  • attributeRemoved(ServletRequestAttributEvent srae);
  • attributeReplaced(ServletRequestAttributEvent srae);
  • String name = ServletRequestAttributEvent.getName()
  • String value = ServletRequestAttributEvent.getValue()
  • SevletContext context = ServletRequestAttributEvent.getSevletContext()
  • ServletRequest request = ServletRequestAttributEvent.getServletRequest()
  • 需要web.xml注册

19. javax.servlet.http.HttpSessionBindingListener

  • javaBean实现HttpSessionBindingListener接口,不需web.xml配置
  • valueBound(HttpSessionBindingEvent event)绑定:对象被放到session域
  • valueUnbound(HttpSessionBindingEvent event)解绑:对象从session域中移除
  • String name = HttpSessionBindingEvent.getName()
  • String value = HttpSessionBindingEvent.getValue()
  • Session session = HttpSessionBindingEvent.getSession()

20. javax.servlet.http.HttpSessionActivationListener

  • javaBean实现HttpSessionActivationListener接口,在META-INF创建context.xml文件,不需web.xml配置
  • Session钝化:当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat的work目录下
  • Session活化:当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象
  • sessionWillPassivate(HttpSessionEvent se); session钝化前执行(session从内存到硬盘)
  • sessionDidActivate(HttpSessionEvent se); session活化后执行(session从硬盘到内存)
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">钝化时间
        <Store className="org.apache.catalina.session.FileStore" directory="test" />
        配置钝化的对象文件在%tomcat%/work/catalina/localhost/项目名称/钝化文件名.ser(test)
    </Manager>
</Context>

21. javax.servlet.Filter

  • filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理,运行在服务器端的程序,先于与之相关的Servlet或jsp前运行,对请求资源过滤的功能,可以处理请求和响应
    • 公共代码的提取
    • 对request和response中的方法进行增强(装饰者模式/动态代理)
    • 进行权限控制
    • 自动登录,解决全局乱码,屏蔽非法文字,响应数据压缩
  • 实现Filter接口并实现所有方法,配置web.xml
    • init(Filterconfig filterconfig);过滤器初始化方法
    • doFilter(ServletRequest,SevletResponse,FilterChain)每次访问这个资源都会执行该方法
    • destory():销毁方法 关闭服务器时
  • Filterconfig方法
    • getFilterName返回 <filter-name> 元素的设置值
    • getServletContext返回ServletContext对象的引用
    • getInitParameter返回在web.xml中Filter初始化的参数值
    • getInitParameterNames返回一个 Enumeration 集合对象
  • FilterChain方法
    • 放行请求chain.doFilter(request, response);

22. web.xml配置

<servlet>
    <servlet-name>QuickStartServlet</servlet-name>
    <servlet-class>xxx.xxx</servlet-class>
    <load-on-startup>3</load-on-startup>启动先后 正整数,越小被创建的优先级越高
    <init-param>
        <param-name>url</param-name>servlet的初始化参数
        <param-value>xxx</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>QuickStartServlet</servlet-name>
    完全匹配:访问的资源与配置的资源完全相同<url-pattern>/LoginServlet</url-pattern>
    目录匹配:./当前路径 ../上一级 格式:/虚拟的目录../\* \*代表任意<url-pattern>/LoginServlet/\*</url-pattern>
    扩展名匹配:\*.扩展名 <url-pattern>\*.jsp</url-pattern>
    (默认)缺省Servlet:将url-pattern配置一个/,代表该servlet是缺省的servlet(默认访问的路径)
    客户端地址添加web应用的名称,重定向,而服务器端的地址不需添加web应用的名称 转发
    <url-pattern>/quickStartServlet</url-pattern>
</servlet-mapping>
主页设置
<welcome-file-list>
    <welcome-file>login.html</welcome-file>
</welcome-file-list>
serveletcofig和servletContext的初始化参数
<context-param>
    <param-name>driver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
    session时间
<session-config>
    <session-timeout>30</session-timeout>
</session-config>
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.ithiema.web.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
注意:url-pattern可以使用servlet-name替代,也可以混用

23. 文件下载

前端配置
<a href="/WEB14/downloadServlet?filename=a.flv">a.flv</a>
服务器端
//1.接收参数
String filename = request.getParameter("filename");//a.flv
\[filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg\]
//2.要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
//3.获取文件的绝对路径<br>
String path = this.getServletContext().getRealPath("/download/"+filename);

\[//获得请求头中的User-Agent
String agent = request.getHeader("User-Agent");
//根据不同浏览器进行不同的编码
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE浏览器
    filename = URLEncoder.encode(filename, "utf-8");
    filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
    BASE64Encoder base64Encoder = new BASE64Encoder();
    filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
    filename = URLEncoder.encode(filename, "utf-8");
}
其中agent就是请求头User-Agent的值\]
//4.告诉客户端该文件不是直接解析 而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//5.获得该文件的输入流
InputStream in = new FileInputStream(path);
//6.获得输出流---通过response获得的输出流 用于向客户端写内容
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
    out.write(buffer, 0, len);
}
in.close();
//out.close();
中文文件乱码:不同的浏览器默认对下载文件的编码方式不同,
ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。
解决浏览器兼容性问题的首要任务是要辨别访问者是ie还是火狐(其他),
通过Http请求体中的User-Agent属性可以辨别

24. mail

  • 邮件的客户端:可以只安装在电脑上的也可以是网页形式的
  • 邮件服务器:起到邮件的接受与推送的作用
  • 接受邮件的协议POP3邮局协议:邮件客户端软件与POP3服务器通讯规则 IMAP 端口号110
  • 发送邮件的协议SMTP邮件协议:邮件客户端软件与SMTP服务及两台SMTP服务器之间的通讯规则,端口号25

25. 转发与重定向的区别

  • 重定向:可以访问外部网站 地址变化 两次请求 路径加工程名 性能较好
  • 转发:只能访问内部资源 地址不变 一次请求 路径不加工程名 性能较弱

26. javaee对象生命周期

  • servlet:(多个)、init第一次访问servlet创建、service每次请求都会执行、destory服务器关闭、项目被移除
  • request:(多个)、访问sevlet时创建、销毁:响应结束、域的作用范围:一次请求中
  • ServletContext:(一个)、web应用被加载、web应用被卸载、域的作用范围:整个web应用
  • session:(多个),第一次执行getsession获得session、没有则创建、非正常关闭服务器(正常关闭session被序列化)
    • session过期,默认时间30分钟,调用invalidate方法,域的作用范围:一次会话中
  • filer:(多个)服务器启动、服务器关闭、每次访问被拦截目标资源,过滤器doFilter方法执行