Servlet3.0 注解和JSP

Servlet3.0 注解

  1. @WebServlet
    开发 servlet 项目,使用@WebServlet 将一个继承于
    javax.servlet.http.HttpServlet 的类定义为 Servlet 组件。在 Servlet3.0 中 , 可以
    使用@WebServlet 注解将一个继承于 javax.servlet.http.HttpServlet 的类标注为可
    以处理用户请求的 Servlet。
    用注解配置 Servlet
    在这里插入图片描述
    也可以配置多个 urlPatterns 来指定多个访问路径
    在这里插入图片描述
  2. @WebFilter
    @WebFilter 用来配置过滤器
    在这里插入图片描述
    使用注解时:过滤器链按照类名的字母排序(大部分情况)
  3. @WebListener
    Servlet3.0 提供@WebListener 注解将一个实现了特定监听器接口的类定义
    为监听器。将 实现了 ServletContextListener 接口的 MyServletContextListener
    标注为监听器。
  4. @MultipartConfig
    使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
    Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传
    的文件进行操作。
    注:如果前台表单提交时的表单类型为enctype=“multipart/form-data”,后台必须要加@MultipartConfig注解!!!!!否则拿不到数据报错

文件上传html页面设置
1、表单的提交类型为POST
2、表单类型设置为enctype=“multipart/form-data”
3、表单元素需要设置name属性值
注意:前台表单action属性的值和后台访问路径一致
注解上传实现步骤:
1丶得到part对象request.getPart(name):name代表前台文件的name属性值
2丶得到上的文件名String fileName = part.getSubmittedFileName();
3丶 得到文件存放路径String realPath = request.getServletContext().getRealPath("/");
4丶上传文件到指定路径part.write(realPath + fileName);string类型的路径+名字;可以拼写

JSP
一、 介绍
JSP:Java Server Page SUN 公司提供的 动态网页编程技术,是 Java Web 服务器端的 动态资源。
它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。
相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java代码产生动态数 据的同时,也很容易对数据进行排版。
在长期的软件实践中,人们逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。
Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。
在这里插入图片描述
静态资源 :css js img html
动态资源: servlet jsp
二、 准备工作

  1. 配置 Eclipse
    配置Eclipse中jsp的字符编码格式为UTF-8和html模板版本为html5

    表示版本html5
  2. 新建 JSP 文件
    servlet版本3.0版本 服务器Tomcat8 jsp基于服务器运行
    在这里插入图片描述

三、 基础语法

  1. 注释
    pre标签: 保留元素原本的格式
    注释标签或者EL表达式使用jsp自己的注释,如果使用html的注释会报错
    注释快捷键:ctrl+shift+/

在 JSP 中支持两种注释的语法操作
1.显示注释: 客户端可以看到的注释
继承HTML风格的注释 <!-- html注释 -->
2.隐式注释: 客户端无法看到的注释
1.jsp自己的注释 <%-- jsp的注释 --%> <%–这是jsp的注释 --%>
2.继承java风格的注释 //单行注释 /多行注释/
JSP 的三种注释方式:
1) // 注释,单行注释 /* 多行注释*/
2)
3)<%-- JSP 注释 --%>

  1. Scriptlet
    注释脚本段用jsp自己的注释
    在 JSP 中最重要的部分就是 Scriptlet( 脚本小程序), 所有嵌入在 HTML 代
    码中的 Java 程序 都必须使用 Scriptlet 标记出来,在 JSP 中一共有三种Scriptlet 代码:
    三种Scriptlet 代码:

     	 注释脚本段用jsp自己的注释
     	第一种:&lt;% %&gt;: java 脚本段,生成的代码在servlet的service方法体中可以定义局部变量、编写语句;
     									<%-- 
     									<% //java脚本段%>
     								 --%>
     	 
     	第二种:&lt;%! %&gt;:声明,生成的代码在servlet类体中可以定义全局(成员)变量、方法、类
     		<%-- 
     			<%! //声明,可以定义全局(成员)变量、方法、类%>
     			 --%>
     	第三种:&lt;%= %&gt;:表达式,生成的代码在servlet的service方法体中输出一个变量或具体内容
     		<%-- 
     			<%= //表达式,数据一个变量或具体内容%>
     			 --%>
    
  2. JSP 的指令标签
    JSP 的指令标签用来控制整个 jsp 的行为,就当前 JSP 页面的某些方面对JSP 转换器作出指示。
    在这里插入图片描述

  1. page 指令
    掌握使用 page 指令常用的属性 contentType 和 pageEncoding,分别用来指定 MIME 类型 和编码格式。import 属性,用来引入其他包,和 java 中 import语句作用相同

MIME 类型
<%@ page contentType=”text/html;charset=UTF-8”%>
手误<%@ page contentType=”test/html;charset=UTF-8”%>此时则变成下载
文件字符编码
contentType 主要的功能是用来设置 MIME(页面响应类型),而charset=”UTF-8” 指定了编码,利用 pageEncoding=”UTF-8”也能指定编码,前者更常用。在 JSP 中,如果 charset 存在,那么 JSP 的编码由 charset 决定,而如果不存在才会由 pageEncoding 来决定,如果都不存在,则使用 ISO-8859-1 编码。
导包
page 指令中存在 import 属性,所以导包就可以正确使用了,在整个 page指令的属性中, 只有 import 语句可以多次出现,其他属性都只能设置一次。
能导包意味着可以直接在 jsp 中 链接数据库。
<%@page import=“java.util." import="java.io.” %>
可以合为一句
<%@page import=“java.util.* ,java.io.*” %>
page指令:
language: 支持的语音目前只有java
contentType: 响应类型及编码格式
pageEncoding: 字符编码
import: 导包 只有该属性可以同时设置多次
errorPage:当前页面报错时跳转页面,一般与isErrorPage属性一起使用,且跳转的页面的isErrorPage属性设置为true
isErrorPage:是否是处理错误的页面,默认是false,一般与errorPage属性一起使用
注:页面的编码以charset的值为准,如果charset未设置,则以pageEncoding为准;
若两者都未设置默认值,则使用默认编码ISO-8859-1

在这里插入图片描述

  1. include 静态包含
    <%@ include file=”要包含的文件路径”%>相对路径
    <%@include file=“include.jsp”%>或者<%@include file=“include.html”%>
    静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样 是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个页面不能有同名的变量。 运行效率高一点点。耦合性较高,不够灵活。
    include静态包含
    格式:<%@ include file=”要包含的文件路径”%>相对路径
    file属性支持表达式去取值
    特点:
    只会生成一个源码文件,相当于直接将内容拷贝进来,所以不能有同名变量,运行效率高,耦合度高,不够灵活
  2. taglib 导入标签库
    <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
    当使用到第三方标签库时需要通过 taglib 标签进行导入
  1. JSP 动作标签
    jsp 的动作标签,与 html 提供的标签有本质的区别:
  • 动作标签是由 tomcat(服务器)来解释执行!与 java 代码一样,都是在服务器
    端执行
  • html 由浏览器来执行!
    格式:
    在这里插入图片描述
    include 动态包含
    include 动作用于动态地包含另一个资源,它可以包含另一个 JSP 页面、一个 Servlet 或 者一个静态的 HTML 页面。
    使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。
    方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
    方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,以后使用的时候直接 导入进来

JSP 中如果要想实现包含的操作,有两种做法: 静态包含、 动态包含,静态包含使用 include 指令即可,动态包含则需要使用 include 动作标签。
动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。
<jsp:include page=“include.jsp”></jsp:include>
注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!
使用动态包含还可以通过在页面之间传参。接收参数通过request.getParameter(name)来完成
注意:有些对象在 JSP 中能够直接使用,可以通过观察.java 代码知道。目前我们只需要知道 request,response,session,application 可以直接使用即可。
include动态包含:
语法:<jsp:include page=“include.jsp” flush=“true”></jsp:include>
page属性支持表达式去取值 flush属性是否使用页面缓存默认值false
特点:
生成多个源码文件,相当于方法的调用,可以有同名变量
耦合度低,比较灵活,效率高
可以传参数
可以包含多次
注意:
1.<jsp:include ></jsp:include> 双标签之间不能有任何内容(除非有参数)
报错: Expecting “jsp:param” standard action with “name” and “value” attributes
2.动态包含可以传递参数值
<jsp:param value=“参数值” name=“参数名”/>
获取参数使用 : request.getParameter(“参数名”);
value属性支持表达式,name属性不支持
报错:The name attribute of the jsp:param standard action does not accept any expressions

动态包含和静态包含都可以包含多次;
page属性和fle属性都支持表达式取值
动态包含可以设置flush属性是否使用页面缓存默认值false,静态包含不可以
动态包含可以传递参数,静态包含不可以传递参数;
动态包含传递参数value值支持表达式,name值不支持

  1. 九大内置对象
    1.request 对象
    request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据。(包括头信息. 系统信息. 请求方式以及请求参数等)。request 对象的作用域为一次请求。
    2.response 对象
    response 代表的是对客户端的响应,主要是将 JSP 容器处理过的对象传回到客户端。response 对象也具有作用域,它只在 JSP 页面内有效。
    3.session 对象
    session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。
    session 对象内部使用 Map 类来保存数据,因此保存数据的格式为“Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字符串类型。
    4.application 对象
    application 对象可将信息保存在服务器中,直到服务器关闭,否则application 对象中保存的信息会在整个应用中都有效。
    与 session 对象相比,application 对象生命周期更长,类似于系统的“全局变量”。
    5.out 对象
    out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
    6.pageContext 对象
    pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的 out. request. reponse. session. application 等对象。pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。
    7.config 对象
    config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。
    当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个Servlet。
    开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
    8.page 对象
    page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。 page 隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。
    9.exception 对象
    exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true"的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。
    exception 对象几乎定义了所有异常情况。如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并
    把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
    在这里插入图片描述

4大域对象
域对象的作用:保存数据,获取数据,共享数据!
Servlet域对象:
域对象 范围 获取
request 一次请求(大于page) 直接使用
session 一次会话(客户端连接到断开服务端过程) request.getSession()
application(ServletContext) 整个web项目(统计访问人数等) request.getServletContext()
JSP域对象:
pageContext对象 request对象 session对象 application对象
输出域对象:
response 对象 out 对象
配置对象 config 对象
异常对象 exception 对象 主要当前页面设置了isErrorPage="true"时才能使用
当前页面对象 page 对象

四、EL 表达式
作用:获取域对象中的值

  1. EL 语法和使用
    EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更 加简化。
    语法结构非常简单: ${expressio}
    EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在 JSP 中一共有四个:pageContext, request, session, application;范围依次是,本页面,一次请求, 一次会话,整个应用程序。而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全 找完了还未找到则返回空字符串””。
    当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是:pageScope, requestScope, sessionScope, applicationScope。
    在这里插入图片描述
  2. EL 运算
    使用 EL 表达式可以用来判断集合中是否有元素 ${empty list}
  1. List 遍历

  2. 访问 map

  3. 做+ 、- 、* 、/( 也可以使用 div 来表示) 、% 、==
    注意:String 也 使用==比较

    EL的基本使用

    uname:${uname}
    uname1:${uname1}
    requestScope:${requestScope.uname}
    str:${str}

    EL对象取值

    user对象: u s e r &lt; b r &gt; 获 取 u s e r 对 象 中 的 属 性 : {user }&lt;br&gt; 获取user对象中的属性: user<br>user:{user.userName }


    EL集合取值

    获取集合:${mylist }----${userList }
    获取指定下标:${mylist[0] }----${userList[0].userName }
    获取集合的长度:${mylist.size() }----${userList.size() }

    判断为空empty

    判断字符串是否为空:${empty str }-----${empty uname1 }---${!empty uname1 }
    判断字符串是否非空:${!empty str }----${empty name }
    判断对象是否为空:${empty user }------${empty User }
    判断集合是否为空:${empty mylist }----${empty userList }----${empty list2 }--${empty list3 }

    EL Map取值

    获取Map的值: ${map }
    获取指定key的value:${map.aaa }----${map["aaa"] }

    EL 运算

    ${num - num2 }---${num2 - num }---${num*num2 }---${num+1 }----${num + num2 }
    ${num / num2 }-----${num2 div num }

    EL 比较

    ${num == 1 }-----${num >=20 }----${str1 eq str2 }----${str4 eq str3 } ${num*2 > num2 }

总结

1) JSP 中有九个内置对象

在这里插入图片描述

  1. JSP 内置对象四种属性范围(重点)
    目标
    ⑴掌握属性的操作方法
    ⑵掌握 JSP 中的四种属性范围的作用
    ⑶掌握 pageContext 对象设置四种属性范围的方法
    四种属性范围
    在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中保存并可以继续使用
    page 范围 pageContext : 只在一个页面中保存属性,跳转之后无效
    request 范围 request : 只在一次请求中保存,服务器跳转后依然有效
    session 范围 session : 在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用
    application 范围 application : 在整个服务器上保存,所有用户都可以用
    属性方法:
    setAttribute(String name, Object o) 设置属性的名称及内容
    getAttribute(String name) 根据属性名称取属性
    removeAttribute(String name) 删除指定的属性

验证各个属性范围的特点
page: 本页面取得服务器端跳转()后无效
request : 服务器跳转()有效,客户端跳转(超链接)无效
如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了
如果希望不管是客户端还是服务器跳转,都可以保存的话,就需要继续扩大范围。
session : 无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的 session 了,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。对于服务器而言,每一个连接到它的客户端都是一个 session
如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application
application : 所有的 application 属性直接保存在服务器上,所有的用户(每一个 session)都可以直接访问取得,只要是通过

application 设置的属性,则所有的 session 都可以取得,表示公共的内容,
但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。

使用哪个范围呢?在合理范围尽可能小
page 范围
page 范围是通过 pageContext 对象设置的,之前研究过的 page 属性范围中使用的是pageContext 进行属性设置的,但是从 javax.servlet.jsp.PageContext 类中可以发现,有以下的
一种设置属性的方法:
public void setAttribute(String name, Object value, int scope)
在 PageContext 类中存在四个表示属性范围的常量,可以直接通过这些常量指定 scope:
pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE
在其它页面取值时,需要指定对应的作用域,或者通过 EL 表达式
<%=pageContext.getAttribute(“a”,pageContext.SESSION_SCOPE)%>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值