`
eric.zhang
  • 浏览: 127164 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSP & Servlet

    博客分类:
  • JSP
阅读更多
JSP:
  • JSP文件必须在JSP服务器内运行,
  • JSP文件必须先生成SERVLET才能执行,
  • 每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成SERVLET
  • JSP页面输送到客户端的是标准的HTML页面


1.JSP注释:
JSP注释用于标注在程序开发过程中的开发提示,不会输出到客户端
<%-- 注释内容 --%>
HTML注释:
HTML注释会显示在客户端.
<!-- 注释内容 -->

2.JSP声明; <%! 声明部分 %>
用于声明变量和方法,实际上,JSP声明将会转换成SERVLET的成员变量或成员方法

3.JSP输出表达式:
<%=表达式 %>
用于输出变量和方法返回值;
如:
<%=count++ %>  <!--使用表达式输出变量的值 -->
<%=info()%> <!--使用表达式输出方法的返回值 -->

4.JSP脚本:<%  %>
JAVA代码必须通过JSP脚本嵌入HTML代码,因此所有能在java程序中执行的代码
都可以在JSP脚本中执行;

5.JSP的3个编译指令:语法 <%@ 编译指令名 属性名="属性值"...%>
  • page:该指令是针对当前页的指令;
  • include:用于指定包含另一个页面;
  • taglib:用于定义和访问自定义标签


6.JSP的7个动作指令
  • jsp:forward:执行页面转向,将请求的处理转发到下一个页面
  • jsp:param:用于传递参数,必须与其他参数的标签一起使用
  • jsp:include:用于动态引入一个JSP页面
  • jsp:plugin:用于下载JavaBean或Applet到客户端执行
  • jsp:userBean:创建一个JavaBean的实例
  • jsp:setProperty:设置javaBean实例的属性值
  • jsp:getProperty:输出javaBean实例的属性值


动作指令与编译指令不同,编译指令是通知servlet引擎的处理消息,而
动作指令只是运行时的脚本动作,编译指令在编译servlet时起作用,
而动作指令通常可替换成JSP脚本,是JSP脚本的标准化写法。

1):jsp:forward:用于将页面响应转发给另外的页面,既可以转发给静态的HTML页
面,也可以转发动态的JSP页面,或者转发到容器中的SERVLET

<%@ page contentType="text/html;charset=gb2312; language="java" %>
<html><head><title>forward的原始页</title></head>
<body>forward的原始页 
<jsp:forward page="forward-result.jsp">
	<jsp:param name="age" value="29"/>
</jsp:forward></body></html>



7:JSP脚本中的9个内置对象:已经默认初始化了,可以直接使用
1)application:javax.servlet.ServletContext的实例
代表JSP所属的web应用本身;
2)config:javax.servlet.Servlet.ServletConfig的实例,
3)exception:java.lang.Throwable的实例,只有当编译指令page的isErrorpage

属 性为true时,该对象才可以使用
4)out:javax.servlet.jsp.JspWriter
5)page
6)pageContext:javax.servlet.jsp.PageContext
7)request:javax.servlet.http.HttpServletRequest
8)response:javax.servlet.http.HttpServletResponse
9)session:javax.servlet.http.HttpSession

8:cookie:
增加cookie也是在response内置对象完成的。
1)创建Cookie实例 构造器:Cookie(String name,String value);
2) 设置Cookie的生命周期,(如果没设置,则浏览器关闭就会自动消失)
3)向客户端写Cookie   (addCookie(Cookie c))
<% 
	//增加cookie
	String name = request.getparameter("name");
	Cookie c = new Cookie("username",name);
	c.setMaxAge(24*3600);
	response.addCookie(c);
%>

<%
	//读取cookie
	//获取本站在客户端上保留的所有cookie
	Cookie[] cookies = request.getCookies();
	//如果cookie的名为username,表明该Cookie是我们需要访问的cookie
	for(Cookie c : cookies){
		if(c.getName().equals("username")){
		out.println(c.getValue());
	}
	}
%>


9.session:
代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器
断开,这个过程就是一次会话,浏览器关闭,session结束,数据也会丢失


10.Servlet与JSP的区别:
1)Servlet中没有内置对象,原来JSP中的内置对象都必须由程序员显式创建
2)对于静太的HTML标签,Servlet都必须使用页面输出流每行输出

11自定义标签库

1)开发自定义标签处理类
必须继承javax.servlet.jsp.tagext.SimpleTagSupport
如果标签类包含属性,每个属性都必须有getter/setter方法
重写doTag()方法
2)建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标

签库   标签库定义文件的根元素为taglib,
还有3个子元素:uri,short-name,tlib-version

3)在JSP中使用自定义标签
使用<%@ taglib uri="" prefix="">导入;



Servlet 必须继承自 HttpServlet

servlet响应客户端请求:
1 doGet
2 doPost
3 doPut
4 doDelete
一般情况下,Servlet对于所有请求的响应都是完全一样的,引时,可以彩重写一个方法来
代替上面的几个方法:只需要重写service()方法即可响应客户端的所有请求

HttpServlet还有两个方法:
init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源
destroy():销毁Servlet实例时,自动调用该方法,回收资源

通常情况下,不需要重写这两个方法,除非需要在初始化Servlet时,完成某些资源
初始化,才需要重写init()方法,如果需要在销毁Servlet之前,先完成某些资源的回收
如:关闭数据库连接,才需要重写destroy方法。

注:如果重写了init方法,则需要在重写该方法的第一行调用super.init(config)。

<servlet>
	<servlet-name>firstServlet</servlet-name>
	<servlet-class>com.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>firstServlet</servlet-name>
	<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>


2.Servlet的生命周期:
Servlet在容器中运行,其实例的创建及销毁等都不是由程序员决定的,而是由
容器控制的。

1)创建Servlet实例有两个时机:(用户请求之时或应用启动之时)
a.客户端第一次请求某个Servlet时,系统创建该Servlet的实例;大部分的

  Servlet都是这种
b.Web应用启动时,立即创建Servlet实例,即load-on-startup Servlet
load-on-startup整数值越小,越优实例化
生命周期:
1)创建Servlet实例
2)Web容器调用Servlet的init方法,对Servlet进行初始末化
3) Servlet初始化后,将一直存在于容器中,处理客户端的请求。
4)Web容器销毁Servlet,先调用destroy方法。

ServletConfig用于获取配置参数的方法,web.xml。为Servlet配置参数使用init-param元

素,包含两个子元素param-name,param-value

web.xml:
<servlet>
	<servlet-name>firstServlet</servlet-name>
	<servlet-class>com.FirstServlet</servlet-class>
	<init-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</init-param>
	<init-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost:3306/j2ee</param-value>
	</init-param>
	<init-param>
		<param-name>user</param-name>
		<param-value>root</param-value>
	</init-param>
	<init-param>
		<param-name>password</param-name>
		<param-value>111111</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>firstServlet</servlet-name>
	<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>



在Servlet里可以直接获取配置的参数:

ServletConfig config = getServletConfig();
String driver = config.getInitParameter("driver");
String url = config.getInitParameter("url");
String user = config.getInitParameter("user");
String password = config.getInitParameter("password");


################################################
Filter流程:
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,
最后Filter再对服务器响应进行后处理;
Filter有如下几个用处:
1 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest
2 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
3 在HttpServletResponse到达客户端之前,拦截HttpServletResponse
4 检查HttpServletResponse,也可以HttpServletResponse头和数据

Filter有以下几种:
1 用户授权的Filter:检查用户请求,过滤掉用户非法的请求
2 日志Filter:详细记录某些特殊的用户请求
3 负责解码的Filter
4 能改变XML内容的Filter等
Filter可以拦截多个请求或响应,一个请求或响应也可被多个Filter拦截

创建一个Filter只需要两个步骤:
1 创建Filter处理类:必须实现javax.servlet.Filter接口。
init(FilterConfig config)
void destroy();
void doFilter(ServletRequest

request,ServletResponse,res,FilterChain chain);
2 web.xml文件中配置Filter

配置Filter:
web.xml
<filter>
		<filter-name>log</filter-name>
		<filter-class>com.LogFilter</filter-class>
	</filter>
	<!-- 如果没有登录到系统,普能用户只能访问/login.jsp,/proLogin.jsp页面
	     只有登录了,才可以自由访问其它页面 -->
	<filter>
		<filter-name>authority</filter-name>
		<filter-class>com.AuthorityFilter</filter-class>
		<!--下面3个init-param元素配置了3个参数 -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>proLogin</param-name>
			<param-value>/proLogin.jsp</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>log</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>authority</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>




import javax.servlet.Filter;
public class AuthorityFilter implements Filter{
	private FilterConfig config;//可用于访问获取Filter的配置信息
	public void init(FilterConfig config){
		this.config = config;
	}
	public void destroy(){
		this.config = null;
	}
	//执行过滤的核心方法
	public void doFilter(ServletRequest request,ServletResponse 

response,FilterChain chain)throws IOException,ServletException{
		//获取配置信息
		String encoding = config.getInitParamter("encoding");
		String loginPage = config.getInitParamter("loginPage");
		String proLogin = config.getInitParamter("proLogin");
		
		//设置request编码用的字符集
		request.setCharacterEncoding(encoding);
		HttpServletRequest req = (HttpServletRequest)request;
		HttpSession session = req.getSession(true);
		//获取客户请求的页面
		String requestPath = req.getServletPath();
		//如果session范围的user为null,即表明没有登录
		//且用户请求的即不是登录页面,也不是处理登录的页面
		if(session.getAttribute("user") == null && !

requestPath.endsWith(loginPage) &&!requestPath.endsWith(proLogin)){
			//forward到登录页面
			request.setAttribute("tip","您还没有登录");
			request.getRequestDispatcher("loginPage").forward

(request,response);
		}else{
			//放行请求
			chain.doFilter(request,response);
		}
	}
}	


2 Listener
Listener的作用非常类似于load-on-startup Servlet(但比load-on-startup启动的早),用于在web应用启动时,启动某些后台程序,
这些后台程序负责为系统运行提供支持

使用Listener需要两个步骤:
1.建Listener实现类
2.在web.xml文件中配置Listener;

1) 创建Listener类必须实现ServletContextListener;接口,包括两个方法:
contextInitialized(ServletContextEvent sce)启动web应用时,系统会调用Listener的该方法
contextDestroy(ServletContextEvent sce) 关闭web应用时,系统会调用Listener的该方法
下面将创建一个获取数据库连接的Listener,该Listener会在应用启动时,获取数据库连接,并将连接设置成application范围内的属性

public class GetConnListener implements ServletContextListener{
	public void contextInitialized(ServletContextEvent sce){
		try{
			//取得该应用的ServletContext实例
			ServletContext application = sce.getServletContext();
			String driver = application.getInitParamter("driver");
			String url = application.getInitParamter("url");
			String user = application.getInitParamter("user");
			String password = application.getInitParamter("password");
			Class.forName(driver);
			Connection conn = DriverManager.getConnection(url,user,password);
			application.setAttribute("conn",conn);
		}catch(exception ex){
			System.out.println(ex.getMessage());			
		}
	}
	public void contextDestroy(ServletContextEvent sce){
		//取得该应用的ServletContext实例
		ServletContext application = sce.getServletContext();
		Connection conn = (Connection)application.getAttribute("conn");
		//关闭数据库
		if(conn != null){
			try{
				conn.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
	}
}


2)配置Listener
web.xml
<listener>
<listener-class>com.GetConnListener</listener-class>
</listener>

3 表达式语言:${expression} EL表达式:支持加,减,乘,除.
表达式语言( expression language) 是一种简化的数据访问方式(),是JSP的一个重要特性,它并不是一种通用的程序语言,
而仅仅是一种数据访问语言,可以方便的访问应用程序数据

1)表达式语言的内置对象11个
使用表达式语言,可以直接获取请求参数值.可以获取页面中javaBean的指定属性值,获取请求头及获取
page,request,session和application范围的属性值等,
内置对象:
pageContext:代表该页面的pageContext对象  (对应javax.servlet.ServletContext)
pageScope:用于获取page范围的属性值 (对应java.util.Map)
requestScope:用于获取request范围的属性值 (对应java.util.Map )
sessionScope:用于获取session范围的属性值 (对应java.util.Map )
applicationScope: 用于获取application范围的属性值 (对应java.util.Map )
param:用于获取请求的参数值 (对应java.util.Map )如同 ServletRequest.getParameter(String name)。回传String 类型的值
paramValues:用于获取请求的参数值,与param的区别在于,该对象用于获取属性值为数组的属性值,(java.util.Map)
如同 隐含对象 类 型 说 明 ServletRequest.getParameterValues(String name)。回传String []类型的值
header:用于获取请求头的属性值,(对应java.util.Map )如同ServletRequest.getHeader(String name)。回传String 类型的值
headerValues:用于获取请求头的属性值,与header的区别在于,该对象用于获取属性值为数组的属性值
(对应java.util.Map )如同ServletRequest.getHeaders(String name)。回传String []类型的值
initParam:(对应java.util.Map)用于获取请求职Web应用的初始化参数,如同 ServletContext.getInitParameter(String name)。回传String 类型的值
cookie:对应java.util.Map,用于获取指定的cookie值,如同HttpServletRequest.getCookies( )

${param.name}, ${param['name']}
${header.host},${initParam["author"]}
${sessionScope["user"]},${cookie["user"].value};

2).与 [ ] 运算符 
EL 提供 . 和 [ ] 两种运算符来存取数据。下列两者所代表的意思是一样的: 
${sessionScope.user.sex} 
等于 
${sessionScope.user["sex"]} 
. 和 [ ] 也可以同时混合使用,如下: 
${sessionScope.shoppingCart[0].price} 
回传结果为shoppingCart中第一项物品的价格。
以下两种情况,两者会有差异: 
(1) 当要存取的属性名称中包含一些特殊字符,如 . 或 – 等并非字母或数字的符号,就一定 
要使用 [ ],
例如: 
${user.My-Name } 
上述是不正确的方式,应当改为: 
${user["My-Name"] } 
(2) 我们来考虑下列情况: 
${sessionScope.user[data]} 
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex}; 
假若data 的值为"name"时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以 
用上述的方法来做,但 . 无法做到动态取值。
例如:${username}。
它的意思是取出某一范围中名称为username的变量。    
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。    
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。    

经验:

1、如果EL表达式无法解析:– <%@ page isELIgnored="false" %>
一、JSTL1、EL运算符>;      

2)var指定变量,并把EL运算结果赋值给该变量值为true/false;      

3)scope:指定 var变量的范围;

6、迭代标签语法:
<c:forEach items=“collection” var=“name” varStatus=“status” begin=“int“ end=”int” step=“int” > //循环体          
</c:forEach>    
说明:
1)items:是集合,用EL表达式;      

2)var:变量名,存放items  
  
3)varStatus: 显示循环状态的变量
①index:从0开始;                    
②count:元素位置,从1开始;                    
③first:如果是第一个元素则显示true;                    
④last:如果是最后一个元素则显示true;      

4)begin:循环的初始值(整型);      

5)end: 循环结束 ;      

6)step:步长,循环间隔的数值;


7、<c:otherwise>标签    
例:如果user.wealthy值true,则显示user.wealthy is true.
<c:choose>
<c:when test="">user.generous is true.</c:when>
<c:when test="">user.stingy is true.</c:when>
<c:otherwise>user.generous and user.stingy are false.</c:otherwise>
</c:choose>
说明:只有当条件user.generous返回值是true时,才显示user.generous is true.只有当条件user.stingy返回值是true时,
才显示user.stingy is true.其它所有的情况(即user.generous和user.stingy的值都不为true)
全部显示user.generous and user.stingy are false.由于JSTL没有形如if (){…} else {…}的条件语句,
所以这种形式的语句只能用<c:choose>、<c:when>和<c:otherwise>标签共同来完成了。

8、c:forTokens>标签说明: 
items 进行循环的项目 是 无delims 分割符 是 无begin 开始条件 否 0end 结束条件 否 集合中的最后一个项目step 步长
否 1var 代表当前项目的变量名 否 无varStatus 显示循环状态的变量 否 无例子:
<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value=""/>
</c:forTokens>
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。

9、<c:redirect>标签    
说明:标签将请求重新定向到另外一个页面,它有以下属性 属性 描 述 是否必须 缺省值url url地址
是 无context /后跟本地web应用程序的名字 否 当前应用程序例子:
<c:redirect /'>http://www.yourname.com/login.jsp"/>将请求重新定向到http://www.yourname.com/login.jsp页,
相当于response.setRedirect("http://www.yourname.com/login.jsp");

10、<c:param>标签    
说明:<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性属 性 描 述 是否必须 缺省值name
在request参数中设置的变量名 是 无value 在request参数中设置的变量值 否 无例子:
<c:redirect url="login.jsp"><c:param name="id" value="888"/></c:redirect>将参数888以id为名字传递到login.jsp页面,
相当于login.jsp?id=888

11、<fmt:>格式化标签    

说明:需要导入   <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>    

1)格式化日期<fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/>            
  Value:通过EL表达式或<%new Date() %> 取的日期值;               Pattern:输出的日期格式;                     

2) 格式化数字<fmt:formatNumber value="${n}" pattern="###,###.##" />
分享到:
评论

相关推荐

    JSP&Servlet学习笔记.pdf

    本书是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习JSP & Servlet时遇到的概念、操作、应用或认证考试等问题及解决方案。  本书针对Servlet 3.0的新功能全面改版,无论是章节架构与范例程序代码,都...

    林学良Jsp&Servlet学习笔记

    **JSP(Java Server Pages)与Servlet是Java Web开发中的两个核心技术,它们在构建动态网页和处理客户端请求方面起着至关重要的作用。** **JSP技术:** JSP是一种服务器端脚本语言,用于创建动态网页。它允许开发者...

    [JSP&Servlet;学习笔记(第2版)]

    **JSP(Java Server Pages)与Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本学习笔记将深入探讨这两个概念,以及它们如何协同工作以提供高效、灵活的Web服务。** **JSP...

    Jsp&Servlet;入门级项目全程实录源码文件

    Jsp&Servlet;入门级项目全程实录源码文件Jsp&Servlet;入门级项目全程实录源码文件Jsp&Servlet;入门级项目全程实录源码文件Jsp&Servlet;入门级项目全程实录源码文件

    JSP & Servlet学习笔记

    本书是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习JSP & Servlet时遇到的概念、操作、应用或认证考试等问题及解决方案。, 本书针对Servlet 3.0的新功能全面改版,无论是章节架构与范例程序代码,都做...

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案 本资源为吉林大学珠海学院JSP&Servlet学习笔记(第二版)的课后答案,涵盖了JSP和Servlet相关的知识点。本笔记共分为九章,每章节都包含了相关的问题答案,...

    JSP &amp; Servlet学习笔记(第2版)

    书中详细介绍了Servlet/JSP与Web容器之间的关系,必要时从Tomcat源代码分析,了解Servlet/JSP如何与容器互动。本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。  ...

    jsp&servlet学习笔记(第2版)光盘

    jsp&servlet学习笔记(第2版)光盘,买书附赠光盘,完片版本。

    Jsp&Servlet学习笔记中的完整范例Gossip

    **JSP(JavaServer Pages)与Servlet是Java Web开发中两个关键的技术,它们在Web应用程序中扮演着重要的角色。** **JSP** 是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,使得网页具有动态生成的能力...

    jsp&servlet;学习笔记_第2版_光盘(看评论酌情下载)

    **JSP(JavaServer Pages)与Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本篇文章将详细讲解这两个技术及其相互关系,以及如何通过学习笔记和提供的源码来深入理解它们...

    [JSP&Servlet学习笔记(第2版)] 林信良

    [JSP&Servlet学习笔记(第2版)] 林信良

    基于jsp&servlet开发的购物车项目

    在IT行业中,Web开发是一项核心技能,而基于JSP(JavaServer Pages)和Servlet的开发是构建动态网站的常见方式。本项目是一个基于这两项技术的购物车应用,旨在帮助初学者理解如何将它们结合起来实现实际功能。在这...

    JSP&Servlet学习笔记(第2版)_打印版

    根据提供的文件信息,标题为“JSP&Servlet学习笔记(第2版)_打印版”,描述指出文档经过空白边裁剪处理以便于打印。虽然提供的部分内文无法直接转化为明确的知识点,但我们可以根据标题和描述推测该文档的主要内容,...

    jsp&servlet电子书

    总之,《jsp&servlet电子书》是学习JSP和Servlet的理想教材,无论你是初学者还是有一定基础的开发者,都能从中获益匪浅。通过阅读这本书,你将能够熟练地运用这两种技术构建高效的Web应用程序,解决实际开发中的各种...

    JSP&Servlet&JavaScript&Ajax&jQuery源代码

    这些文件名称列表揭示了一个关于Web开发的教程结构,主要涵盖了JSP(JavaServer Pages)、Servlet、JavaScript、Ajax和jQuery这五个关键的技术。接下来,我们将详细探讨这些技术及其在实际应用中的重要性。 **JSP...

Global site tag (gtag.js) - Google Analytics