Java EE编程技术学习笔记(2)-Servlet
来源:互联网 发布:mysql pid文件丢失 编辑:程序博客网 时间:2024/06/05 02:36
Servlet
工作流程
1. Servlet装入和初始化:装入并实例化,调用init()初始化
2. 调用Servlet:Servlet对应一个URL地址,web.xml对URL地址与Servlet映射
3. 处理请求:Web容器创建新线程调用service(),检查HTTP请求类型调用doGet等方法
4. 多个请求的处理:多个请求会生成多个线程,只有一个Servlet实例,通过实现SingleThreadModel避免并发访问
5. 退出:调用destroy(),移出内存
编程接口
Servlet会实现Servlet和HttpServlet两个接口之一,HttpServlet是Servlet接口类的一个抽象子类:
1. HttpServletRequest 请求
2. HttpServletResponse 响应
3. ServletConfig
4. ServletContext
5. ServletException
6. HttpSession 跨越请求页面维持会话
7. RequestDispatcher 请求转发器
编写一个Servlet:
1. class First extends HttpServlet
2. doGet/doPost响应GET、POST,调用void processRequest(HttpServletRequest,HttpServletResponse)
3. PrintWriter out = response.getWriter()
4. http://localhost:8080/SimpleServlet/First
context.xml <Context path=”/ SimpleServlet”/>
web.xml <url-pattern>/First<url-pattern>
5.@WebServlet(name=”First”,urlPatterns={“/First”}),优先级低于配置文件
3.3处理请求:
3.3.1 请求参数
(1)
POST GET方法提交数据,Servlet都是调用HttpServletRequest的getParameter()方法。
Login.html <form action=”GetPostData” method=”post”>
<input type=”text” name=”username”>
GetPostData.java:
processRequest():
@WebServlet(name=” GetPostData”,urlPatterns={“/ GetPostData”})
response.setContentType(“text/html;charset=UTF-8”)
request.getParameter(“username”)
(2)
response.setContentType(“text/html;charset= gb2312”) 设置提取编码方式
request.setCharacterEncoding(“gb2312”) 设置显示编码方式
(3)
<input type=”checkbox” name=”checkbox1“ value=”苹果”>
String[] paramValues = request.getParameterValues(“checkbox1”)
3.3.2 Header
accept user-agent host connection cookies等
getHeader() (Enumeration)getHeaderNames()
3.3.3上传文件
Part getPart(String name) Collection<Part> getParts(String name)
<form action=”UpLoad” enctype=”multipart/form-data” method=”post”><input type=”file” name=”file1” /></form>
@MultipartConfig(location=”c:\\tddownload”)
request.getParts()
p.write(path+fname) path=this.getServletContext().getRealPath(“/”) fname=getFileName(p)调用p.getHeader(“content-disposition”)
p.getContentType().contains(“image”)
3.3.4 异步处理
Servlet 3.0提供异步处理支持:对请求数据预处理;Servlet线程交给异步线程,异步线程有request和response引用,可以响应或者转发下一个Servlet。
可以应用于<servlet><filter>两个组件,
<servlet>添加<async-supported>true</async-supported>
@WebServlet(name=”AsyncServlet”, urlPattern={“/ AsyncServlet”}, asyncSupported=true)
AsyncContext ctx = request.startAsync();
new Thread(new Executor(ctx)).start();//Executor实现Runnable
out = ctx.getResponse().getWriter();
3.4 生成响应
1.编码类型 Content-Type代表响应正文的MIME类型,浏览器根据它来显示文档。
2.流操作
getWriter() 字符 PrintWriter
getOutputStream 字节 ServletOutputStream
缓冲区数据发送到客户端的情况:缓冲区满、ServletResponse的flushBuffer()、ServletOutputStream或PrintWriter的flush()、close()
单独打开文件不是在浏览器打开 response.setHeader(“Content-disposition”,”attachment;filename=Example.pdf”)
3.重定向
response.sendRedirect(“”);
请求已重定向,再继续操作Request或Response会有意外抛出
已经有信息输出到客户端的情况下不允许进行重定向
5. Servlet配置
初始化参数
@WebServlet(…,…,initParams = {@WebInitParam(name=” FilePath”,value=”...”)})
String pdfDir = this.getServletConfig().getInitParameter(“FilePath”);
URL模式
只能有两种格式:*.扩展名或/开头/*结尾
默认Servlet用于其他Servlet都不处理的访问请求
6. 会话管理
会话跟踪技术:Cookie、UL重写、隐藏表单域
(1)Cookie
Cookie[] cookies = request.getCookies();
...
cookies[i].getName().equals(“SimpleServlet”);
cookie = cookies[i]; //可以读cookie
...
cookie = new Cookie(“SimpleServlet”, ”create by hyl”);
cookie.setPath(request.getContextPath());
cookie.setMaxAge(maxAge);
response.addCookie(cookie); //可以写回cookie
...
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
...
Out.println(“Cookie value: ”cookie.getValue()+”<br>”); //”create by hyl”
...
(2)URL重写
@WebServlet(name=”URLRewrite1”,urlPatterns={“/url1”})
...
String encodeUrl = response.encodeURL(contextPath+”/url2?name=张三&age=27”)
@WebServlet(name=”URLRewrite2”,urlPatterns={“/url2”})
...request.getParameter(“name”);...
(3)HttpSession
HttpSession建立在Cookie和URL重写技术之上,Web容器自动实现了关于会话跟踪的底层机制
常用接口: isNew() getId() setAttribute() getAttribute() setMaxInactiveInterval() invalidate()
7.Servlet上下文
String Temperature = (String) getServletContext().getAttribute(“Temperature”);
Temperature = getInitParameter(“Temperature”);
getServletContext().setAttribute(“Temperature”,Temperature);
8.Servlet间协作
Main.java
RequestDispatcher dispatcher = request.getRequestDispatcher(“LoginSuccess”);
Dispatcher.forward(request, response);
LoginSuccess.java
...
LoginFail.java
...
RequestDispatcher dispatcher = request.getRequestDispatcher(“login.html”);
Dispatcher.include(request, response);
RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别:
(1)forward是容器中控制权的转向,不会显示转向后的地址,redirect是完全的跳转,浏览器得到跳转的地址并重新发送请求连接
(2)性能上forward更加高效
(3)Forward只能转向到Web应用内部的资源
(4)转发对象RequestDispatcher可以通过HttpServletRequest或ServletContext获得,重定向只有HttpServletResponse
(5)三个方法的URL参数有所区别
9.Filter
@WebFilter(filterName = “TimeTrackFilter”, urlPattern = {“/Main”})
Filter接口:init(),destroy(),doFilter()
FilterConfig对象一般用来获取web.xml初始化的对象
FilterChain chain.doFilter(request, response)
10.Listener
Web应用利用9类Listener接口实现对Web容器的请求、会话以及应用上下文三个层面上的事件的监听处理。
@WebListener()
Public ... Implements HttpSessionListener {
Public void sessionCreate(HttpSessionEvent evt) {
String current = (String)evt.getSession().getServletContext().getAttribute(“online”);
...
}
}
- Java EE编程技术学习笔记(2)-Servlet
- Java EE编程技术学习笔记(1)-Java EE概述
- Java EE编程技术学习笔记(3)-JSP
- Java EE编程技术学习笔记(4)-JDBC
- Java EE编程技术学习笔记(5)-JPA
- Java EE编程技术学习笔记(6)-EJB
- Java EE编程技术学习笔记(7)-Web服务
- 学习笔记-轻量级Java EE:Servlet基础
- Java EE学习笔记之一——JSP/Servlet相关技术
- Java EE之Servlet技术
- Java EE之Servlet技术
- Java EE学习笔记之二——Servlet部分
- 学习笔记-轻量级Java EE:Servlet之Filter
- Java EE学习笔记
- Java EE 学习笔记
- Java EE学习笔记
- Java EE 技术 —— Servlet
- Java web学习笔记之servlet技术
- Python3.5连接MySQL
- 牛腩——登录中的知识
- php面向对象编程之构造方法的使用
- spring中各个模块的作用
- E
- Java EE编程技术学习笔记(2)-Servlet
- J
- 【设计模式】 装饰模式与代理模式的对比
- Rosalind-翻译RNA序列
- *Wet Shark and Bishops(思维) CodeForces
- DTMF信号检测之goertzel算法
- Android中的一些小知识点
- Java EE编程技术学习笔记(3)-JSP
- C#知识积累