Java EE编程技术学习笔记(2)-Servlet

来源:互联网 发布:mysql pid文件丢失 编辑:程序博客网 时间:2024/06/05 02:36

Servlet

工作流程

1. Servlet装入和初始化:装入并实例化,调用init()初始化

2. 调用ServletServlet对应一个URL地址,web.xmlURL地址与Servlet映射

3. 处理请求:Web容器创建新线程调用service(),检查HTTP请求类型调用doGet等方法

4. 多个请求的处理:多个请求会生成多个线程,只有一个Servlet实例,通过实现SingleThreadModel避免并发访问

5. 退出:调用destroy(),移出内存

 

编程接口

Servlet会实现ServletHttpServlet两个接口之一,HttpServletServlet接口类的一个抽象子类:

1. HttpServletRequest 请求

2. HttpServletResponse 响应

3. ServletConfig

4. ServletContext

5. ServletException

6. HttpSession 跨越请求页面维持会话

7. RequestDispatcher 请求转发器

 

编写一个Servlet

1. class First extends HttpServlet

2. doGet/doPost响应GETPOST,调用void processRequest(HttpServletRequestHttpServletResponse)

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都是调用HttpServletRequestgetParameter()方法。

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线程交给异步线程,异步线程有requestresponse引用,可以响应或者转发下一个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

缓冲区数据发送到客户端的情况:缓冲区满、ServletResponseflushBuffer()ServletOutputStreamPrintWriterflush()close()

单独打开文件不是在浏览器打开 response.setHeader(“Content-disposition”,”attachment;filename=Example.pdf”)

3.重定向

response.sendRedirect(“”);

请求已重定向,再继续操作RequestResponse会有意外抛出

已经有信息输出到客户端的情况下不允许进行重定向

5. Servlet配置

初始化参数

@WebServlet(…,…,initParams = {@WebInitParam(name=” FilePath”,value=”...”)})

String pdfDir = this.getServletConfig().getInitParameter(“FilePath”);

URL模式

只能有两种格式:*.扩展名或/开头/*结尾

默认Servlet用于其他Servlet都不处理的访问请求

6. 会话管理

会话跟踪技术:CookieUL重写、隐藏表单域

(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建立在CookieURL重写技术之上,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可以通过HttpServletRequestServletContext获得,重定向只有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应用利用9Listener接口实现对Web容器的请求、会话以及应用上下文三个层面上的事件的监听处理。

@WebListener()

Public ... Implements HttpSessionListener {

Public void sessionCreate(HttpSessionEvent evt) {

String current = (String)evt.getSession().getServletContext().getAttribute(“online”);

...

}

}