Servlet和JSP学习总结

目录

  1. Jsp会被编译成servlet,在页面被第一次访问的时候
  2. Jsp中可以在html页面中嵌入java代码或者引入jsp标签
  3. 可以在html中引入自定义标签
  4. Web工程的目录结构
  5. Jsp的注释
  6. Jsp声明部分
  7. Jsp输出表达式
  8. Jsp脚本
  9. Jsp的三个编译命令
  10. B/S结构
  11. 九大内置对象
  12. Servlet的缺点
  13. servlet的编写步骤
  14. Servlet与Jsp的区别
  15. Servlet与Jsp的生命周期
  16. 自定义标签
  17. Filter的使用
  18. 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完成的功能为:

1) 向远程服务器发送请求

2) 读取远程服务器返回的字符串数据

3) 根据远程服务器返回的字符串渲染出一个web页面

S完成的功能为:

1) 启动单独的线程
2) 使用I/O流读取用户的请求数据
3) 从请求数据中简析参数
4) 处理用户请求
5) 生成响应数据
6) 使用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>&lt&lt</button> ");
        out.write("<button>&lt</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>&gt</button> ");
        out.write("<button>&gt&gt</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 }

原文地址:https://www.cnblogs.com/youjile/p/11743091.html

时间: 2024-10-09 03:18:35

Servlet和JSP学习总结的相关文章

servlet和jsp学习指南(一)servlet

近期接触了些纯servlet与jsp的编程项目,顺便把<servlet和jsp学习指南>这本书拿出来看看,感悟良多.记下随笔,以便会议. 要编写一个servlet首先要实现Servlet或者继承HttpServlet package test.com.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet

servlet和jsp学习指南(三)监听器

监听器是为了能够在servlet/jsp应用程序中进行事件驱动编程(Event-Driven Programming),所有事件类源自java.util.Event,并且监听器在以下三个不同级别中均可用:ServletContext.HttpSession及ServletRequest. 我选择性的学习ServletContextListener.主要是其他的在项目中没有看到使用.有用到再来补充学习. javax.servlet.ServletContextListener.这是对Servlet

Servlet和JSP学习指导与实践(三):JSP助阵

前言: JSP(Java Server Page)虽然作为一门服务端的语言,但它并没有创新新的语言标准.有些人一接触jsp之后发现易学易懂.实际上,jsp的内部原理仍然是基于Servlet,它是Servlet的补充,而并不是要取代Servlet.本文对JSP的一些概念及基础内容进行了不详尽的总结,希望感兴趣的博友凑合着看~ ------------- Part I: jsp指令,脚本元素,动作 1.常见指令 (1)page指令: <%@ page language="java"

Servlet和JSP学习指导与实践(一)

前言: JavaSE如何跨度到JavaEE?原本java语言只是专门用于application桌面小应用程序的开发,但自从其追随CGI进入服务器端的开发之后便一发不可收拾.先是Servlet1.0,再是2.0,然后又3.0 ... 之后,各种基于Web的框架发展迅猛,Spring,Struts,Struts2等等.从事Java的人不少都是从jsp开始,甚至从框架开始,但却不知Servlet为何物?本系列将专门讲述Java Web的始祖---“Servlet”(会讲述JSP相关内容,但其实JSP也

servlet和jsp学习指南(四)jsp页面

jsp其实就是servlet,当访问这个页面时,服务器会先把jsp页面编译为一个xxx_jsp.class和xxx_jsp.java,存在work中 使用eclipse的同学可以在你的eclipse的workspace的workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work下找到 举例:一个最简单hello页面 访问后可得到2个文件 <%@ page language="java" contentTyp

servlet和jsp学习指南(五)EL表达式

EL表达式的具体用法我暂时先不说了 这里就简单说说注意点 package test.com.servlet.jstl; public class Book { private String isbn; private String title; private Double price; public Book(String isbn,String title,double price) { this.isbn = isbn; this.title = title; this.price = p

servlet和jsp学习指南(二)Session管理

Web语言HTTP是无状态的,默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的用户.但正常应用程序需要记住用户身份的,换句说,它必须能够管理用户session. 用于保持状态的常用方法有4种:网址重写.隐藏域.cookie已经HttpSession. (一)网址重写 网址重写是一种Session追踪技术,需要将一个或多个token作为一个查询字符串添加到一个URL钟.注意URL和token之间要用一个问号(?)隔开,两个token之间则是用一个&符号隔开.

Servlet&JSP学习笔记

Servlet&JSP学习笔记 */--> Servlet&JSP学习笔记 Table of Contents 1 Web容器 2 内置对象 2.1 内置对象分类 2.1.1 out 2.1.2 request 2.1.3 application 2.1.4 response 2.1.5 session 2.1.6 其他 3 JavaBean 3.1 JSP动作元素 3.2 javabean的四个作用於范围 4 JSP状态管理 4.1 Cookie 4.2 include 指令与动作

Servlet&amp;Jsp学习笔记归纳图(一)

转载请注明出处!!!版权必究!! 以下是Servlet&Jsp的学笔记归纳图,详细内容以及相关代码会在后面整理完成 后给出 使用的是思维导图工具:MindManager 6 最新版本是2013,有兴趣的自己百度下载,功能更多,安装有点麻烦 以下提供版本6绿色版免安装版下载: http://pan.baidu.com/s/1jGqlnXc 本节思维导图文件下载:http://pan.baidu.com/s/1eQGbMSU Servlet&Jsp学习笔记归纳图(一),布布扣,bubuko.c