servlet和jsp笔记
时间:2019-10-31
本文章向大家介绍servlet和jsp笔记,主要包括servlet和jsp笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.Servlet =================================================================== Servlet是一个Java程序,一个Servlet应用程序经常包含一个或者多个Servlet。JSP页面要被翻译成Servlet,并进行编译。 Servlet和JSP是JaveEE定义的众多技术当中的两种。其他的技术还包括: Java Message Service(JMS) Enterprise JavaBeans(EJB) JavaServerFaces(JSF) Java Persistence Servlet API 1.javax.servlet:Servlet与Servlet容器之间契约的类和接口。 2.javax.servlet.http : HTTPServlet与Servlet容器之间的契约的类和接口。 3.javax.servlet.annotation:Servlet、Filter和Listener进行标注的注解。它还为标注元件指定元数据。 4.javax.servlet.descriptor:为web应用程序的配置信息提供编程式访问的类型。 javax.servlet.Servlet接口 5个方法: public void init(ServletConfig arg0); public void service(ServletRequest arg0, ServletResponse arg1); public void destroy(); 以上三个是生命周期方法,以下两个是非生命周期方法: public ServletConfig getServletConfig(); public String getServletInfo(); MyServlet的例子中使用了WebServlet注解 @WebServlet(name="MyServlet", urlPatterns="/my") service方法的两个参数: ServletRequest:封装有关请求的信息。 ServletResponse:隐藏了将响应发送给浏览器的复杂性。 ServletConfig获取参数实例: @WebServlet(name="ServletConfigDemoServlet", value="/conf", initParams={ @WebInitParam(name = "admin", value = "kizzle"), @WebInitParam(name = "email", value = "zhangkaipc@163.com"), }) ......省略代码...... String admin = servletConfig.getInitParameter("admin"); String email = servletConfig.getInitParameter("email"); ServletContext 每个web应用程序只有一个context。 通过ServletConfig调用getServletContext方法获取。 GenericServlet 直接使用Servlet接口我们要实现所有的方法,即使没有代码,并且还要将ServletConfig对象保存到类变量中。使用GenericServlet就可以避免以上麻烦。 只需要覆盖public void service(ServletRequest request, ServletResponse response); javax.servlet.http.HttpServlet类: HttpServlet类覆盖javax.servlet.GenericServlet类 HttpServletRequest接口继承了javax.servlet.ServletRequest HttpServletResponse接口继承了javax.servlet.ServletResponse HttpServlet类特性: 1.不覆盖service方法。覆盖doGet,doPost,doHead,doPut,doTrace,doOptions,doDelete这个七个方法。 2.HttpServletRequest替代了javax.servlet.ServletRequest,HttpServletResponse替代了javax.servlet.ServletResponse。 web.xml 使用web.xml代替WebServlet注解。 <servlet>,<servlet-name>,<servlet-class> <servlet-mapping>,<servlet-name>,<url-pattern> 2.Session管理 ================================================================ 保持状态的4种方法:网页访问链接重写(URL rewriting),隐藏域,cookie及HttpSession对象。 cookie 1.创建cookie: new Cookie(name, value); 2.发送浏览器:httpServletResponse.addCookie(cookie); 3.访问Cookie: Cookie[] cookies = request.getCookies();迭代数组。 4.删除cookie:new cookie --> cookie.setMaxAge(0); --> response.addCookie(cookie); HttpSession对象 HttpSession getSession():如果没有,则创建一个并返回。 HttpSession getSession(boolean create): false如果没有,则返回null。 setAttribute(name, value) getAttribute(name) getAttributeNames():返回Enumeration。 string getId():获取HttpSession的标识符。 session购物车实例 3.JSP概述 ============================================================================== JSP的API,4个包: 1.javax.servlet.jsp:包含核心类和接口,S/J容器用来将JSP页面转换成Servlet。 2.javax.servlet.jsp.tagext:用于开发定制标签的类型。 3.javax.el:为Unified Expression Language 提供API。 4.javax.servlet.jsp.el:提供S/J容器必须支持的类,以便支持JSP中的EL。 JSP页面 --> JSP页面实现类(实现javax.servlet.jsp.JspPage接口或javax.servlet.jsp.HttpjspPage接口) --> 编译Servlet类 JSP页面与Servlet不同处: JSP页面不需要在部署描述符中进行标注或映射成一个URL。应用程序目录下的每一个JSP页面都可以通过浏览器中输入页面的路径来实现直接的调用。 添加完一个新的JSP页面之后,不需要重启Tomcat。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Date" %> <%@ page import="java.text.DateFormat" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Todays Date</title> </head> <body> <% DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); String s = df.format(new Date()); out.println(s); %> </body> </html> JSP隐式对象 1.request -->javax.servlet.http.HttpServletRequest 2.response -->javax.servlet.http.HttpServletResponse 3.out -->javax.servlet.jsp.JspWriter 4.session -->javax.servlet.http.HttpSession 5.application -->javax.servlet.ServletContext 6.config -->javax.servlet.ServletConfig 7.pageContext -->javax.servlet.jsp.PageContext 8.page -->javax.servlet.jsp.HttpJspPage 9.exception -->javax.lang.Throwable PageContext的setAttribute和getAttribute四种范围: page,request,session,application 【1.指令】 1.page指令:可以就当前JSP页面的某些方面对JSP转换器提出指示。 格式:<%@ page attribute1="value1" attribute2="value2" ... %> 2.include指令:将另一个文件的内容放到当前的JSP页面中。 格式:<%@ include file="url" %> 【2.脚本元素】 -- 3种类型: 1.Scriptlet:java代码块,它以<%开头,以%>结束。 2.声明:java代码块,它以<%!开头,以%>结束。声明在JSP页面中使用的变量和方法。 3表达式:java代码块,它以<%=开头,以%>结束。运算结果会被填入隐式对象out的print方法中。 This is <%=java.util.Calendar.getInstance().getTime() %> void jspInit():JSP页面初始化时,会被调用。 void jspDestory():JSP页面被销毁时,会被调用。 都没有参数和返回值。 关闭脚本元素 web.xml <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group> </jsp-config> 【3.动作】可以传递参数 动作(Action)被编译成执行某个操作的Java代码。 useBean,setProperty,getProperty,include,forward include指令和动作区别: 指令:1.发生在页面转换的时候。页面-->Servlet。 2.资源文件的扩展名不重要。 动作:1.发生在请求的时候。可以传递参数。2.文件扩展名必须为jsp,否则被当作静态文件处理。 <jsp:useBean id="today" class="java.util.Date" /> <%=today%> 错误处理 1.页面中处理 <%@ page isErrorPage="true"%> <% out.println(exception.toString());%> 2.引导其他页面 <%@ page errorPage="errorHandler.jsp"%> 4.EL ===================================================== ${expression} []:访问属性host,accept-language .:访问属性有效的java变量名称。 EL隐式对象 pageContext initParam param paramValues header headerValues cookie applicationScope sessionScope EL运算符 ${empty X} :X为0,'',{}则返回true。 关闭EL运算 1.JPS中关闭方法: <%@ page isELIgnored="true"%> 2.web.xml中关闭方法: <jsp-config> <!-- 关闭脚本元素 --> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group> <!-- 关闭EL运算:指定某个jsp --> <jsp-property-group> <url-pattern>/noEl.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> <!-- 关闭EL运算:所有jsp --> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> 5.JSTL ====================================================== 一个定制标签类库的集合。 jar包下载:菜鸟教程网站JSTL中有下载。 配置步骤: 1.解压拷贝jstl.jar和standard.jar到/WEB-INF/lib中 2.拷贝需要的tld到/WEB-INF 3.web.xml中配置 <jsp-config> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> </jsp-config> 4.JSP页面中使用:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:out value="beijing"></c:out> JSTL五大类 Core:变量支持、流向控制、URL管理、杂项 前缀:c XML:Core、流向控制、转换 前缀:x I18n:语言环境、消息格式化、数字和日期格式化 前缀:fmt 数据库:SQL 前缀:sql 功能:集合长度、字符串操作 前缀:fn JSP使用JSTL类库的格式: <%@ taglib uri="uri" prefix="prefix" %> 例如:使用Core类库,JSP页面开头处声明: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 通用动作指令 out标签:<c:out value="value" default="defaultValue" /> set标签:<c:set var="name" value="value" scope="page" /> <c:set target="${javaBean}" property="propertyName" value="val" /> <c:set target="${javaBean}" property="propertyName">Value</c:set> remove标签:<c:remove var="val" scope="page" /> 条件式动作指令 if标签:<c:if test="testCondition" var="valName" scope="page" /> 没有主体 <c:if test="testCondition" var="valName" scope="page" />body</c:if> choose-when-otherwise标签: <c:choose> <c:when test="${admin=='kizzle'}"> hello, kizzle </c:when> <c:when test="${admin=='root'}"> hi,root </c:when> <c:otherwise> sorry </c:otherwise> </c:choose> Iterator动作指令 forEach标签: <c:forEach var="x" begin="1" end="10" varStatus="status"> ${status.count}: <c:out value="${x}" /><br/> </c:forEach> 对Map进行迭代: <c:forEach items="${cityCode}" var="mapItem" > ${mapItem.key} -- ${mapItem.value }<br/> </c:forEach> forTokens标签: <c:forTokens items="beijing,shanghai,shengzheng,zhuzhou,changsha" delims="," var="keyword" > ${keyword}<br/> </c:forTokens> 格式化指令 formatNumber,formatDate,parseNumber,parseDate,timeZone,setTimeZone <fmt:formatDate value="${now}" pattern="yyyy年MM月dd日" /> <fmt:timeZone value="GMT+7:00"> <fmt:formatDate value="${now}" pattern="yyyy.MM.dd HH:mm:ss" /> </fmt:timeZone> 函数(EL函数) ${fn:contains("hello world", "hello") } 6.编写定制标签 =========================================================== SimpleTag 简单标签处理器 生命周期: 1.JSP容器通过调用其无参构造器,创建一个简单标签处理器实例。简单标签处理器必须有一个无参构造器; 2.JSP调用public void setJspContext(JspContext jspContext); (重要方法JspWriter getOut()) 3.如果被嵌套在其他标签中,调用方法public void setParent(JspTag parent); 4.为每个属性调用设置方法setter; 5.如果标签有主体内容,调用setJspBody方法; 6.调用doTag方法。 步骤: 1.编写类,放在/WEB-INF/classes,该类实现SimpleTag接口。 2.使用tag元素注册标签,放在/WEB-INF,tld文件。 3.使用标签,jsp页面中使用taglib指令,引入标签。 /WEB-INF/classes/customtag/Mytag.java =================================================================== package customtag; public class Mytag implements SimpleTag { private JspContext jspContext; @Override public void doTag() throws JspException, IOException { // TODO Auto-generated method stub System.out.println("doTag ......"); jspContext.getOut().println("This is Mytag."); } @Override public void setJspContext(JspContext pc) { // TODO Auto-generated method stub this.jspContext = pc; } } =================================================================== /WEB-INF/mytags.tld =================================================================== <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>mytag</description> <display-name>learn tag</display-name> <tlib-version>1.1</tlib-version> <short-name>m</short-name> <tag> <name>firstTag</name> <tag-class>customtag.Mytag</tag-class> <body-content>empty</body-content> </tag> </taglib> =================================================================== firstTagTest.jsp =================================================================== <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/mytags.tld" prefix="m" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <m:firstTag/> </body> </html> =================================================================== 处理属性 /WEB-INF/classes/customtag/AttributeTag.java =================================================================== package customtag; public class AttributeTag implements SimpleTag { private String header; private String items; private JspContext jspContext; public void setHeader(String header) { this.header = header; } public void setItems(String items) { this.items = items; } @Override public void doTag() throws JspException, IOException { // TODO Auto-generated method stub JspWriter out = jspContext.getOut(); out.println("<table style='border:1px solid green'>"); out.println("<tr><td><b>"+header+"</b></td></tr>"); for(StringTokenizer st = new StringTokenizer(items, ",");st.hasMoreElements();) { out.println("<tr><td>"+st.nextElement()+"</td></tr>"); } out.println("</table>"); } @Override public void setJspContext(JspContext pc) { // TODO Auto-generated method stub this.jspContext = pc; } } =================================================================== /WEB-INF/attrtag.tld =================================================================== <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>attrtag</description> <display-name>attribute tag</display-name> <tlib-version>1.1</tlib-version> <short-name>m</short-name> <tag> <name>attrTag</name> <tag-class>customtag.AttributeTag</tag-class> <body-content>empty</body-content> <attribute> <name>header</name> <required>true</required> </attribute> <attribute> <name>items</name> <required>true</required> </attribute> </tag> </taglib> =================================================================== atrributeTagTest.jsp =================================================================== <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/attrtag.tld" prefix="m" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <m:attrTag items="beijing,shanghai,hunan,changsha,zhuzhou" header="city"/> <hr/> <m:attrTag header="goods"> <jsp:attribute name="items"> pingguo,putao,hamigua,xigua </jsp:attribute> </m:attrTag> </body> </html> =================================================================== 管理标签主体 实例: <select> <option value="beijing">beijing</option> <option value="guangzhou">guangzhou</option> <option value="shanghai">shanghai</option> </select> =================================================================== public class BodyTag extends SimpleTagSupport { private String[] citys = {"beijing", "guangzhou", "shanghai"}; @Override public void doTag() throws JspException, IOException { // TODO Auto-generated method stub JspContext jspContext = getJspContext(); JspWriter out = jspContext.getOut(); out.print("<select>\n"); for(String city: citys) { getJspContext().setAttribute("value", city); getJspContext().setAttribute("text", city); getJspBody().invoke(null); } out.print("</select>\n"); } } =================================================================== <tag> <name>bodyTag</name> <tag-class>customtag.BodyTag</tag-class> <body-content>scriptless</body-content> </tag> =================================================================== <m:bodyTag> <option value="${value }">${text }</option> </m:bodyTag> =================================================================== 编写EL函数 步骤: 1.创建一个包含静态方法的public类,放在/WEB-INF/classes目录中。 2.利用function元素注册函数。 =================================================================== package customtag; public class FunctionEL { public static String reverseString(String str) { return new StringBuffer(str).reverse().toString(); } } =================================================================== <function> <description>function el</description> <name>functionEL</name> <function-class>customtag.FunctionEL</function-class> <function-signature> java.lang.String reverseString(java.lang.String) </function-signature> </function> =================================================================== ${m:functionEL("hello world") } =================================================================== 7.标签文件 ================================ 1.标签文件放在/WEB-INF/tags中,tag文件。 2.JSP页面利用taglib元素引用标签。 tag指令 <%@ tag (attribute="value")* %> 除了import属性,其他属性都只能出现一次。 include指令:<%@ include ...%> taglib指令 atrribute指令 variable指令 doBody指令:<jsp:doBody .../> invoke指令:<jsp:invoke .../> ============================================================= <%@ attribute name="input" required="true"%> <%! public String encodeHtmlTag(String tag){ if(tag==null){ return null; } int length = tag.length(); StringBuilder sb = new StringBuilder(length*2); for(int i=0; i<length;i++){ char ch = tag.charAt(i); if(ch=='<'){ sb.append("<"); }else if(ch=='>'){ sb.append(">"); }else if(ch=='"'){ sb.append("""); }else if(ch==' '){ sb.append(" "); }else if(ch=='&'){ sb.append("&"); }else{ sb.append(ch); } } return sb.toString(); } %> <%! public String myPrint(String tag){ return tag; } %> <%=myPrint(input) %><br/> <%=encodeHtmlTag(input) %> =============================================================== <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib tagdir="/WEB-INF/tags" prefix="f" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <f:attributeTagFile input="<br/> means changing lines."/> </body> </html> ===============================================================
原文地址:https://www.cnblogs.com/zhangkaipc/p/11770972.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 树莓派基础实验9:蜂鸣器实验
- 浅谈文件上传漏洞(客户端JS检测绕过)
- java字符串操作:如何实现字符串的反转及替换?
- 树莓派基础实验10:干簧管传感器实验
- Java 字节流 字符流 io流
- 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分 隔。
- 树莓派基础实验11:U型光电传感器实验
- java 缓冲流+原理图解
- 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码
- Java 编程,打印昨天的当前时刻.
- git merge后 丢失文件 以及 代码
- 树莓派基础实验12:PCF8591模数转换器实验
- spring boot多数据源的代码实现
- 树莓派基础实验13:雨滴探测传感器实验
- Java中的TCP通信程序