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