JSP & Servlet

JSP:
[list]
[*]JSP文件必须在JSP服务器内运行,
[*] JSP文件必须先生成SERVLET才能执行,
[*] 每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成SERVLET
[*] JSP页面输送到客户端的是标准的HTML页面
[/list]

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

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

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

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

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

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

动作指令与编译指令不同,编译指令是通知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="###,###.##" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值