Servlet与JSP学习笔记
一、Servlet 注册
web.xml里边注册Servlet ,定义格式如下:
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>golden.test.helloworld</servlet-class>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-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"); Enumeration<String> names = = 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:forward page="topage.jsp">
<jsp:param name="username", value="zhangsan"></jsp:param> // 通过参数对象${param.username}获取 EL表达式
</jsp:forward>
JSP Include 动态包含
<jsp:include page="topage.jsp"></jsp:include> //也可以增加jsp:param
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:<c:set value="zhangsan" var="username" [scope="page|request"]/>
格式2:<c:set target="${objName}" property="" value="" [scope="page|request"]/>
out标签
<c:out value="" escapeXml="false" default=""/> escapeXml为false时,翻译成Html输出,否则原样输出。
if标签
<c:if test="">hehe</c:if>
<c:choose>
<c:when test="">1</c:when>
<c:when test="">2</c:when>
<c:otherwise>99</c:otherwise>
</c:choose>
foreach标签
<c:foreach items="${mylist}" var="item" begin="" end="" step="">
${item.propertyname}
</c:foreach>
九、应用举例
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();
Servlet与JSP学习笔记的更多相关文章
- Servlet和JSP读书笔记(二)
一. GenericServlet 1. 前面写的 Servlet和JSP学习笔记(一) 中的实例都是通过实现Servlet接口编写的,这样存在的问题就是:你必须实现Servlet中的所有方法,而不管 ...
- JSP学习笔记
JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...
- java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象
JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...
- JSP 学习笔记1
JSP 学习笔记 JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例--JSP页面有系统编译成Servlet,Servlet再负责响应用户请求. 1.JSP注释 < ...
- jsp学习笔记:mvc开发模式
jsp学习笔记:mvc开发模式2017-10-12 22:17:33 model(javabe)与view层交互 view(视图层,html.jsp) controller(控制层,处理用户提交的信息 ...
- Servlet 3.1学习笔记
Servlet 3.1学习笔记 参考文档 Servlet 3.1标准 什么是 Servlet ? Servlet 是基于 Java 平台的 Web 组件,由一个容器管理,能够生成动态内容. 什么是 S ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- 测试Servlet生命周期学习笔记
测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...
- JSP学习笔记2
<JAVA遇见HTML——JSP篇>学习笔记(下) 1.Javabean Javabeans就是符合某种规范的java类,使用Javabeans的好处是[解决代码的重复编写],减少代码冗余 ...
- Servlet乘法表学习笔记
一.控制台实现乘法表 package com.shanrengo; import java.io.IOException; import java.io.PrintWriter; import jav ...
随机推荐
- 指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)
接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): #include <stdio.h> ...
- 如何在Debian10镜像中设置Nginx引擎模块
目前,我们较多的服务器WEB环境都是用的Nginx引擎,我们采用服务器的目的是可以获取到更多的资源,而且建站数量是不受限制的.我们可以根据自己需要配置Nginx,可以自定义特定域的设置,允许您在单个服 ...
- useCallback与useMemo使用场景
疑问:为什么需要useCallback和useMemo 答: 父组件变化,会引起子组件的 re-render,为了阻止子组件不必要的 re-render,需要满足两个条件: 1.子组件用 react. ...
- 设置eclipse默认编码为UTF-8 Set default encoding to utf-8 in eclipse
设置eclipse默认编码为UTF-8 Set default encoding to utf-8 in eclipse 1,windows->Perferences->General-& ...
- Netty Reactor模型
1.netty抽象出两个线程池:BossGroup负责监听和建立连接 :WorkerGroup 负责网络IO的读写 2.BossGroup 和 WorkerGroup 类型都是NioEventLoop ...
- css 多行隐藏
overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box- ...
- using Spire.Pdf 合并文件夹下.pdf 文件
using Spire.Pdf private void mergePDF() { List<string> filesList = new List<string>(); D ...
- Git ignore 失效 忽略已经提交推送远程的文件不生效
因为这个文件已经被纳入版本管理中了 所以需要删掉. 1.先把需要忽略的文件暂存下来.再到.gitignore 添加要忽略的文件的路径 2.再删除本地的缓存 在 git bash 执行 git rm - ...
- Docker info 查看报错 WARNING: No swap limit support 解决
docker可以通过启动命令来限制容器可以使用的最大物理内存和swap,但是通常在使用这些命令的时候经常会碰到"WARNING: No swap limit support"警告 ...
- ubuntu ssh远程访问出现Permission denied(publickey,password)解决方法
windows上安装SSH服务设置–>应用–>可选功能–>添加功能–>安装 OpenSSH服务器 和 OpenSSH客户端在左下角搜索栏输入服务,将相关SSH服务设置为自动(延 ...