web
约 3199 字大约 11 分钟
web
- 1. WEB三大规范
- 2. javax.servlet.Servlet servlet
- 3. javax.servlet.http.HttpServlet
- 4. javax.servlet.ServletRequest
- 5. javax.servlet.http.HttpServletRequest
- 6. javax.servlet.ServletResponse
- 7. javax.servlet.http.HttpServletResponse
- 8. javax.servlet.ServletContext
- 9. javax.servlet.ServletConfig
- 10. javax.servlet.http.Cookie
- 11. javax.servlet.http.HttpSession
- 12. java.util.EventListener
- 13. javax.servlet.ServletContextListener
- 14. javax.servlet.http.HttpSessionListener
- 15. javax.servlet.ServletRequestListener
- 16. javax.servlet.ServletContextAttributeListener
- 17. javax.servlet.http.HttpSessionAttributeListener
- 18. javax.servlet.ServletRequestAttributeListener
- 19. javax.servlet.http.HttpSessionBindingListener
- 20. javax.servlet.http.HttpSessionActivationListener
- 21. javax.servlet.Filter
- 22. web.xml配置
- 23. 文件下载
- 24. mail
- 25. 转发与重定向的区别
- 26. javaee对象生命周期
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/line
- 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.com");
- 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 集合对象
- getFilterName返回
- 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方法执行