Servlet与JSP学习笔记
一、Servlet 注册
web.xml里边注册Servlet ,定义格式如下:
<servlet> <servlet-name>helloworldservlet-name> <servlet-class>golden.test.helloworldservlet-class> <init-param> <param-name>param-name> <param-value>param-value> init-param> servlet> <servlet-mapping> <servlet-name>helloworldservlet-name> <url-pattern>/helloworldurl-pattern> servlet-mapping>
二、Servlet 生命周期
init
ServletConfig->StandardWrapperFacade
初始化参数,通过config.getInitParameterNames()获取,数据来源于web.xml对Servlet的init-param参数配置
ServletContext 上下文,通过config.getServletContext()获取
service
ServletRequest->HttpServletRequest->RequestFacade
ServletResponse->HttpServletResponse->ResponseFacade
destory
三、Servlet一些类、方法、配置、使用方式
GenericServlet
HttpServlet
load-on-startup Web.xml配置文件启动加载
url-pattern 通配符 *.xxx 比如.do .action /开头或者*.开头
ServletContext获取路径
context.getRealPath("") Web应用的根目录
context.getResource("index.jsp") 返回Url url.getPath()返回Web访问路径:/localhost/app/index.jsp
context.getResourceAsStream("abc.txt")
ServletContext属性操作(设置、获取、删除)
context.setAttribute("username","zhangsan");
context.getAttribute("username");
context.removeAttribute("username");
ServletContext获取初始化参数
context.getInitParameterNames() 数据来源于web.xml的context-param参数配置
重定向redirect
服务器通知浏览器请求另外一个地址。 response.setRedirect("topage.html");
转发forward
服务器内部转发行为。只输出最后一个Servlet的Response数据。
RequestDispatcher dispatcher = request.getRequestDispatcher("to_servlet_name");
dispatcher.forward(request,response);
包含include
服务器内部Include行为。
RequestDispatcher dispatcher = request.getRequestDispatcher("to_servlet_name");
dispatcher.include(request,response);
四、Response发送数据
使用字节流
ServletOutputStream os = response.getOutputStream(); String data = "EN中文"; response.setContentType("text/html;charset=utf-8");//设置浏览器字符解码方式 如果不设置,默认ISO 8859-1传输,浏览器默认解码使用GBK os.write(data.getBytes("UTF-8"));//设置流字符编码,与浏览器字符解码一致 如果不设置,默认GBK // os.println(data);//异常报告:不是ISO 8859-1字符:[中]
使用字符流
response.setContentType("text/html;charset=utf-8");//设置浏览器字符编码解析方式 // response.setCharacterEncoding("utf-8"); PrintWriter pw = response.getWriter(); pw.append("EN中文");
五、Request获取数据
// POST方式 中文处理 request.setCharacterEncoding("UTF-8"); Enumerationnames = = request.getParameterNames(); while (names.hasMoreElements()) { String name = names.nextElement(); String value = request.getParameter(name); pw.println(name + ": " + value); // GET方式 中文处理 // pw.println(name + ": " + new String(value.getBytes("ISO-8859-1"), "UTF-8")); }
//相关路径
request.getRequestPath(); //返回值:http://localhost:8080/appName/login
request.getContextPath(); //返回值:/AppName
request.getServletPath(); //返回值:/login
六、Cookie
//添加Cookie Cookie ck = new Cookie("username", "golden"); ck.setMaxAge(24 * 60 * 60);//单位秒,如果不设置,默认有效期Session response.addCookie(ck); //添加中文Cookie http协议 ISO-8859-1 Cookie ck = new Cookie("username", URLEncoder.encode("中文","utf-8")); response.addCookie(ck); //获取Cookie Cookie[] cookies = request.getCookies(); //Cookie路径 //目录1:/app/dir1/ //目录2:/app/dir1/dir2/ //目录2下可以读取目录2和目录1的Cookie,目录1下只能读取目录1的Cookie //Cookie路径设置 ck.setPath("/"); //设置根目录
七、Session
HttpSession sess = request.getSession(); pw.println(sess.isNew()); pw.println(sess.getId()); //设置JSESSIONID有效期 ck = new Cookie("JSESSIONID", sess.getId()); ck.setMaxAge(24 * 60 * 60); response.addCookie(ck); //Cookie被禁用 可以使用Url重写jsessionid=0285723C18EFFFBCE08036933A9AC59A //调用encodeUrl或者encodeRedirectUrl后,urlString变为login;jsessionid=0285723C18EFFFBCE08036933A9AC59A //前提:urlString为有效地址 String urlString="/login"; urlString = response.encodeUrl(urlString) urlString = response.encodeRedirectUrl(urlString);//空串不会输出
八、JSP
JSP Page指令
用来定义JSP文件的全局属性。
格式:<%@ page language="java" %>
<%@ page import="java.util.List" %>
<%@ page isErrorPage="true" errorPage=""err.jsp%> //很少用
JSP Include指令 静态包含
JSP 脚本命令
声明标签:<%! java方法或者字段 %>
表达式标签:<%= (1+2) %>
代码块标签:<% 代码块 %>
JSP 注释 <%-- 注释内容 --%>
JSP内置对象
四大作用域: ServletContext application、 HttpSession session、 HttpRequest request、 Object page
ServletConfig config、HttpServletResponse response、 exception、JspWriter out、pageContext
PageContext
<% pageContext.setAttribute("user", "golden"); pageContext.setAttribute("user", "golden PAGE_SCOPE",PageContext.PAGE_SCOPE); pageContext.setAttribute("user", "golden REQUEST_SCOPE",PageContext.REQUEST_SCOPE); pageContext.setAttribute("user", "golden SESSION_SCOPE",PageContext.SESSION_SCOPE); pageContext.setAttribute("user", "golden APPLICATION_SCOPE",PageContext.APPLICATION_SCOPE); %> <%= pageContext.findAttribute("user") %> <%= pageContext.getAttribute("user") %>
JSP forward标签
JSP Include 动态包含
EL表达式运算符
加:$(1+1)
减:$(2-1)
乘:$(3*2)
除:$(4/2) $(4 div 2)
余:$(5%2) $(5 mod 2)
还有下标访问、关系运算符、逻辑运算符等,与Java基本一样。
EL
<%= pageContext.findAttribute("username") %> 与 ${username} 一致,都是从四大作用域获取数据。
四大作用域:requestScope、pageScope、applictionScope、sessionScope。指定域获取数据,例如:${requestScope.username}
${headerValues} //请求头对象集合
JSTL javaserver pages standard tag lib 标准通用函数库
使用步骤:
1、导包
2、使用taglib指令声明引用 <% taglib prefix="c" uri="http://java.sum.com/jstl/……" %>
3、标签
set标签 用了将变量存储在jsp范围或者javabean的属性。
格式1:
格式2:
out标签
if标签
foreach标签
${item.propertyname}
九、应用举例
1、重定向
response.setStatus(302);
response.setHeader("location","toPage.html');
2、数据压缩
String data="aaa";
for (int i=0; i<10000; i++){
data+="aaa";
}
System.out.println("原始数据大小:"+data.getBytes().length);
ByteArrayOutputStream bout=new ByteArrayOutputStream();
GZIPOutputStream goutenew GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte[] byteArray=bout.toByteArray();
response.setHeader("Content-Encoding","gzip");
response.setHeader("Content-length", byteArray.length+"");
response.getOutputStream().write(byteArray);
3、浏览器定时刷新
response.setHeader("refresh","5;toPage.html");
4、浏览器下载
response.setHeader("content-disposition""attachment;filename=downloadname.jpg"); String path = this.getServletContext().getRealPath("/1.jpg"); FileInputStream in=new FileInputStream(path); byte buffer[] =new byte[1024]; int len=0; OutputStream out = response.getoutputstream(); while ((len = in.read(buffer))>0){ out.write(buffer,o,len); } out.close(); in.close();