Servlet和JSP学习总结
目录
- Jsp会被编译成servlet,在页面被第一次访问的时候
- Jsp中可以在html页面中嵌入java代码或者引入jsp标签
- 可以在html中引入自定义标签
- Web工程的目录结构
- Jsp的注释
- Jsp声明部分
- Jsp输出表达式
- Jsp脚本
- Jsp的三个编译命令
- B/S结构
- 九大内置对象
- Servlet的缺点
- servlet的编写步骤
- Servlet与Jsp的区别
- Servlet与Jsp的生命周期
- 自定义标签
- Filter的使用
- Listener的使用
1. Jsp会被编译成servlet,在页面被第一次访问的时候
2. Jsp中可以在html页面中嵌入java代码或者引入jsp标签
3. 可以在html中引入自定义标签
4. Web工程的目录结构
<webDemo> --工程名称
|--WEB-INFO
| |-- classes
| |--lib
| |--web.xml
|--a.jsp
5. Jsp的注释
<%-- --%> 这种注释在浏览器中查看源码时看不见
<!-- --> 这种注释在浏览器中点击查看源码时看见注释中的内容
6. Jsp声明部分
声明变量或者方法,转换为Servlet后对应的是成员变量和成员方法。
<%!
public int a;
public int add(a, b){
return a + b;
}
%>
7. Jsp输出表达式
<%=a %>
<%=add(1,2) %>
8. Jsp脚本
<table>
<%
for(int i=0; i<10; i++){
%>
<tr><td>循环值</td><td><%=i %></td></tr>
<%
}
%>
</table>
9. Jsp的三个编译命令
编译指令的格式如下
<%@ 编译指令 属性名=”属性值” %>
编译指令为:
page
include
taglib
编译指令都有默认值,不需要为每一个指令设置值。
- page指令
%@ page language="java"
extends=""//指定此jsp编译成servlet继承的类
import="package1","package2",……,"packagen"//导入页面需要的包
session="true|false"//指定页面是否需要session
pageEncoding="utf-8"//指定生成网页的编码字符集
%>
- include指令
- taglib指令
10. B/S结构
B/S也即Browser/Server
B完成的功能为:
- 向远程服务器发送请求
- 读取远程服务器返回的字符串数据
- 根据远程服务器返回的字符串渲染出一个web页面
S完成的功能为:
- 启动单独的线程
- 使用I/O流读取用户的请求数据
- 从请求数据中简析参数
- 处理用户请求
- 生成响应数据
- 使用I/O流向客户端发送请求数据
上面步骤中1、2、6由服务器完成,3、4、5由用户编码完成。
11. 九大内置对象
- application
- config
- excaption
- page
- pageContext
- request
- session
- out
- response
作用域对象
application、session、request、page
application、session、request和pageContext 4个对象分别用于操作application、session、request和page范围内存的数据。
application
application中的数据的作用范围是从第一次创建该数据开始,在应用的整个生命周期中有效,并且在所有jsp和servlet中都可以访问。
setAttribute(String name, String value);
getAttribute(String name)
pageContext
pageContext对象可以获取application、session、request、page 4个范围内的数据,使用的是如下两个方法:
getAttribute(String name);
getAttribute(String name, int scope);
//scope的值为如下:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
同样也提供了两个set方法来向这4个范围设置属性值。
setAttribute(String name,String value);
setAttribute(String name, String value, int scope);
request
request包含了用户的一次请求的所有数据,包括请求头和用户设置的参数。
获取用户设置的参数信息:
String getParamater(String name);//获取参数name对应的值
Map getParamaterMap();//获取所有参数的名称和值组成的Map对象
Enumeration getParamaterNames();//获取所有参数的名称组成的枚举对象
String[] getParamaterValues(String name);//一个参数有多个值,返回该参数所有的值组成的数组
获取用户请求头信息:
String getHadder(String name);//获取指定请求头的值
Enumeration<String> getHadderNames();//获取请求头的所有名称
Enumeration<String> getHadderNames(String name);//获取指定请求头的多个值
int getIntHadder(String name);//获取指定请求头的值,并将该值转化为整数
操作request范围内的属性:
setAttribute(String attName, Object attValue);
Object getAttribute(String attName);//获取request范围内的属性
get与post的区别:
请求方式 | 发起方式 | 表现效果 | 数据传输量 |
get | 在浏览器地址栏直接输入网址,或者form表单没有设置method属性,或者form表单的method属性设置为get。 | 在浏览器地址栏将请求参数以key=valued的方式显示在地址后面 | 一般不超过2KB |
post | form表单中的method属性设置为post | 在浏览器地址栏中不会显示key=value的方式 | 一般认为不受限制,取决于服务器。 |
**response**
response是一个输出对象,跟out对象功能相似。不同的是out对象是JspWriter的实例,JspWriter是Writer的子类。Writer是字符流,无法输出非字符类容。如果需要输出字节流(Excel,位图,PDF等),out无法完成,但是response可以完成。
response作用之重定向:
<% response.sendRedirect(“target.jsp”); %>
请求转发和重定向的区别:
请求转发(forward) | 重定向(redirect) |
执行forward后依然是上一次请求 | 执行redirect后生产第二次请求 |
forword后的页面可以访问原请求的请求参数,因为是同一次请求,所有原请求的请求参数、request范围内的所有属性都存在 | redirect后的页面不能访问原请求的请求参数,因为是第二次请求,所有原请求的请求参数、request范围内的所有属性都丢失 |
地址栏中的请求URL不会变化 | 地址栏改为重定向的目标URL,相当于在浏览器的地址栏输入新的URL按回车键 |
response作用之增加Cookie:
在浏览器设置为运行Cookie写入的情况下
<%
String userName = request.getParamater(“name”);
Cookie c = New Cookie(“userName”, userName);
c.setMaxAge(24*3600);
response.addCookie(c);
%>
request有一个获取Cookie的方法
<%
Cookie[] cs = request.getCookies();
for(Cookie c : cs){
if(c.getName.equals(“userName”)){
out.println(c.getValue());
}
}
%>
session
session是一次会话,一次会话的含义是:用户连接服务器开始,到用户连接服务器结束。session中的属性在一次会话中有效,不管一次会话执行了多少次的请求转发或者重定向,session中的属性都有效,直到改会话结束,所有的属性就失效。
12. Servlet的缺点
如果使用servlet来开发html页面,需要在java代码中编写大量的html标签,通过servlet的输出流输出到页面,这样开发效率很低。
后来servlet主要在MVC模式中演变为控制器。
13. Servlet的编写步骤
编写普通java类,继承HttpServlet类,重写一下两个方法:
doGet(HttpServletRequest request, HttpServletResponse response)
doPost(HttpServletRequest request, HttpServletResponse response)
HttpServlet还包括以下以前方法:
doPut(HttpServletRequest request, HttpServletResponse response);
doDelete(HttpServletRequest request, HttpServletResponse response);
init(ServletConfig config);
destroy();
14. Servlet与Jsp的区别
(1)Servlet没有内置对象,原来Jsp中的对象对必须由程序显示创建。
(2)对应静态的HTML标签,Servlet都必须使用页面输出流进行输出。
15. Servlet与Jsp的生命周期
Servlet实例的创建时机:
(1)系统第一次访问某个Servlet时,系统创建改Servlet的实例。
(2)系统启动是立即创建Servlet的实例,及load-on-startup Servlet
Servlet的生命周期:
graph LR
创建实例成功-->完成初始化
完成初始化-->响应客户请求
响应客户请求-->资源回收完成
资源回收完成-->实例被销毁
系统完成Servlet的初始化后,Servlet将一直存在于容器中。
16. 自定义标签
(1)编写标签类
编写没有任何标签属性的标签类
package cn.com.starit.tag;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloWorldTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write("hello world " + new Date());
}
}
编写带有标签属性的标签类
package cn.com.starit.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class PagingTag extends SimpleTagSupport {
private String currPage; //当前页
private String countPage; //每页多少条
public String getCurrPage() {
return currPage;
}
public void setCurrPage(String currPage) {
this.currPage = currPage;
}
public String getCountPage() {
return countPage;
}
public void setCountPage(String countPage) {
this.countPage = countPage;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = this.getJspContext().getOut();
out.write("<div> ");
out.write("<button><<</button> ");
out.write("<button><</button> ");
out.write("······ ");
int currPageI = Integer.parseInt(currPage);
if(currPageI == 1) {
out.write("<button style=\"background-color: #7ED321;color: #FFFFFF\">1</button> ");
out.write("<button>2</button> ");
out.write("<button>3</button> ");
out.write("<button>4</button> ");
out.write("<button>5</button> ");
}
if(currPageI == 2) {
out.write("<button>1</button> ");
out.write("<button style=\"background-color: #7ED321;color: #FFFFFF\">2</button> ");
out.write("<button>3</button> ");
out.write("<button>4</button> ");
out.write("<button>5</button> ");
}
if(currPageI >= 3) {
out.write("<button>"+(currPageI-2)+"</button> ");
out.write("<button>"+(currPageI-1)+"</button> ");
out.write("<button style=\"background-color: #7ED321;color: #FFFFFF\">"+currPageI+"</button> ");
out.write("<button>"+(currPageI+1)+"</button> ");
out.write("<button>"+(currPageI+2)+"</button> ");
}
out.write("······ ");
out.write("<button>></button> ");
out.write("<button>>></button> ");
out.write("每页<select> ");
int countPageI = Integer.parseInt(countPage);
if(countPageI == 1000) {
out.write("<option value=\"1000\" selected>1000</option> ");
} else {
out.write("<option value=\"1000\" >1000</option> ");
}
if(countPageI == 100) {
out.write("<option value=\"100\" selected>100</option> ");
} else {
out.write("<option value=\"100\" >100</option> ");
}
if(countPageI == 50) {
out.write("<option value=\"50\" selected>50</option> ");
} else {
out.write("<option value=\"50\" >50</option> ");
}
if(countPageI == 30) {
out.write("<option value=\"30\" selected>30</option> ");
} else {
out.write("<option value=\"30\" >30</option> ");
}
if(countPageI == 20) {
out.write("<option value=\"20\" selected>20</option> ");
} else {
out.write("<option value=\"20\" >20</option> ");
}
if(countPageI == 10) {
out.write("<option value=\"10\" selected>10</option> ");
} else {
out.write("<option value=\"10\" >10</option> ");
}
out.write("</select>条 ");
}
}
(2)编写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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>mytaglib</short-name>
<uri>http://passport.kdgcsoft.com/mytaglib</uri>
<tag>
<description>Outputs Hello, World</description>
<name>helloWorld</name>
<tag-class>cn.com.starit.tag.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<description>Construct Paging Tag</description>
<name>paging</name>
<tag-class>cn.com.starit.tag.PagingTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>currPage</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>countPage</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
(3)在jsp页面中通过 taglib标签引入
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib uri="http://passport.kdgcsoft.com/mytaglib" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2><mytag:helloWorld/></h2>
<mytag:paging currPage="5" countPage="100"/>
</body>
</html>
17. Filter的使用
Filter有如下几个用处:
- 在HttpServletRequest到达Servlet之前,拦截HttpServletRequest,请求。
- 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
- 在HttpServletResponse到达客户之前,连接HttpServletResponse请求。
- 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter有如下几个种类:
- 用户授权的Filter,Filter专门用户检查用户情况,过滤不合法的用户请求。
- 日志Filter,详细记录模型特殊用户的请求日志。
- 负责解码的Filter,包括对非标准编码的请求解码。
创建Filter的步骤
(1)创建Filter类
创建Filter类必须实现Filter接口,在Filter接口中定义了如下三个方法:
init(FilterConfig config)//初始化Filter
destroy()//销毁Filter前回收资源
doFilter(ServletRequest request, ServletResponse response, FilterChain chain);//实现过滤功能
以下是一个Filter类
package cn.com.starit.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 记录请求日志
*/
public class MyFilter implements Filter{
private FilterConfig config;
@Override
public void destroy() {
this.config = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
ServletContext servletContext = this.config.getServletContext();
HttpServletRequest hrequest = (HttpServletRequest)request;
System.out.println("开始过滤......");
System.out.println("已经截获到用户的请求地址"+hrequest.getServletPath());
chain.doFilter(request, response);
System.out.println("过滤结束");
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
(1)配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>test_web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.com.starit.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 配置myFilter过滤器 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>cn.com.starit.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
18. Listener的使用
当web应用在web容器中不断的运行时,web容器内部不断的发送各种事件,如web应用被启动,web应用被停止,用户session开启,用户session结束,用户请求到达等。
Servlet API提供了大量的监听器来监听web应用内部的事件。从而允许当事件发送时可以回调监听器的方法。
创建Listener的步骤:
(1)定义Listener实现类
(2)在web.xml中配置Listener
常用的web监听器事件:
ServletContextListener用于监听web应用的启动和关闭
ServletContextAttributeListener用于监听ServletContext范围内(application)属性的改变
ServletRequestListener用于监听用户的请求
ServletRequestAttributeListener用于监听ServletRequest范围内(request)属性的改变
HttpSessionListener用户监听用户session的开始和结束
HttpSessionAttributeListener用于监听用户HttpSession范围内(session)属性的改变
下面以ServletContextListener创建一个实例
package cn.com.starit.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("关闭应用之前调用这里......");
}
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("启动应用前调用这里......");
}
}
在web.xml中配置Listener
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>test_web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.com.starit.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 这里是过滤器配置 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>cn.com.starit.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 这里是监听器定义 -->
<listener>
<listener-class>cn.com.starit.listener.MyListener</listener-class>
</listener>
</web-app>
19. JSP中的输出表达式
输出表达式定义:
${ }
可以输出pageScope、requestScope、sessionScope、applicationScope是个作用域的值。如下:
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationAcope.name }
Servlet和JSP学习总结的更多相关文章
- Servlet和JSP学习指导与实践(三):JSP助阵
前言: JSP(Java Server Page)虽然作为一门服务端的语言,但它并没有创新新的语言标准.有些人一接触jsp之后发现易学易懂.实际上,jsp的内部原理仍然是基于Servlet,它是Ser ...
- Servlet和JSP学习指导与实践(二):Session追踪
前言: web应用中经常需要对某些有用的信息进行存储或者附加一些信息.本文主要介绍session,即“会话”跟踪的几种不同方式~ ----------------------------4种管理ses ...
- Servlet和JSP学习指导与实践(一):Servlet API初探
前言: JavaSE如何跨度到JavaEE?原本java语言只是专门用于application桌面小应用程序的开发,但自从其追随CGI进入服务器端的开发之后便一发不可收拾.先是Servlet1.0,再 ...
- 《Servlet和jsp学习指南》 笔记1
chapter 1 Servlet 4个java 包: 对于每一个http请求,Servlet请求都会创建一个ServletRequest实例,并将它传给Servlet的service方法.Servl ...
- 《Servlet和jsp学习指南》 笔记2
chapter 13 请求和响应的装饰 初步了解Decorator模式: 在不修改一个对象的类的源码的情况下,装饰这个对象的行为. chapter 14 异步处理 异步Servlet和Filter,只 ...
- Servlet和JSP读书笔记(二)
一. GenericServlet 1. 前面写的 Servlet和JSP学习笔记(一) 中的实例都是通过实现Servlet接口编写的,这样存在的问题就是:你必须实现Servlet中的所有方法,而不管 ...
- Servlet和JSP之JSTL学习
JSTL JSTL就是JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合.条件测试.XML处理 ...
- Servlet和JSP之标签文件学习
在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦. tag file指令 tag file简介 用tag file的方式,无需编写标签处理类和标签库描述文件,也可以自定义标签.tag ...
- Servlet和JSP之自定义标签学习
此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述. 参考:慕课网的<JSP自定义标签>视频; <Servlet.JSP和Sprin ...
随机推荐
- PAT 甲级 1024 Palindromic Number (25 分)(大数加法,考虑这个数一开始是不是回文串)
1024 Palindromic Number (25 分) A number that will be the same when it is written forwards or backw ...
- Go 微服务架构Micro相关概念理解
Micro是一个微服务框架(或者说是工具集):提供了各类组件,解决微服务架构中的不同问题,服务监控.服务发现.熔断机制,负载均衡等等,自己一个个解决这些问题几乎不可能,这时候就需要借助go-micro ...
- python多线程使用场景
python多线程使用场景 如果程序时cpu密集型的,使用python的多线程是无法提升效率的,如果程序时IO密集型的,使用python多线程可以提高程序的整体效率 CPU密集型(CPU-bound) ...
- 如何屏蔽掉烦人的www.google-analytics.com
有时候在开发的网站项目中会加载谷歌分析的js,并且加载的非常慢导致浏览器一直在转圈圈. 按下面的方法可屏蔽掉烦人的www.google-analytics.com 现在想只有屏蔽掉google-a ...
- Unity动态批处理和静态批处理学习
本文转自:http://blog.csdn.net/lyh916/article/details/45725499,请点击链接查看楼主大神原文,尊重楼主版权. 参考链接:Unity圣典:http:// ...
- What is Dark Social & Dark Traffic?
What is Dark Social & Dark Traffic? By Iaroslav Kudritskiy Google Analytics is supposed to speak ...
- 【计算机视觉】深度相机(九)--OpenNI API及中间件说明
本文由官方文档翻译而来 总览 目的 OpenNI 2.0 API(应用程序编程接口)提供了访问PrimerSense的兼容深度传感器.这就使得一个应用程序能够初始化传感器和从设备接收深度(depth) ...
- 【VS开发】图像颜色
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/. 最近被图像颜色整的乱七八糟的,一会儿YUV422,一会儿RGB,一会儿gray... ...
- Linux ps 查看进程
[root@wang /]# ps aux ps -elf ^C [root@wang /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIM ...
- 最新 龙采科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.龙采科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了龙采科技.6.7月主要是做系统复习.项目复盘.Leet ...