JavaWeb阶段 - JSP学习总结

    技术2023-05-20  87

    概述

    JSP全称Java Server Pages,是一种动态网页开发技术,使用JSP标签在HTML网页中插入Java代码,简化Server编写只对网页中需动态产生的内容采用Java代码编写,静态内容则采用HTML网页方式编写Servlet的缺陷(JSP出现的原因):写静态页面必须部署后才能看到效果,很难控制页面的外观JSP以静态代码为主,Java代码为辅,Servlet反之JSP从本质上来说内核还是Servlet,但与Servlet不是替代关系而是一种互补的关系JSP适合于写显示层的动态页面(与HTML书写位置相同),而Servlet则适合写控制层的业务控制(页面转发,与java书写位置相同)JSP的执行效率低于Servlet

    运行原理

    WEB容器接受到以.jsp为扩展名的URL访问请求时,将请求交给JSP引擎去处理,JSP引擎将它翻译成Servlet源程序,再编译成class类文件,之后由WEB容器装载执行JSP规范没要求脚本代码必须采用Java语言,但JSP页面最终会转换为Java Servlet程序eclipse中修改jsp模板编码:window → Preferences → Web → JSP Files → Encoding → 修改编码 → Apply and Close

    生命周期

    1.访问jsp页面时,web容器查找是否有相关对象2.无则将.jsp翻译为.java文件,再编译为.class文件3.创建构造器,实例化对象4.执行_jspInit()方法,将对象放入WEB容器中5.执行_jspService()方法,处理业务逻辑,把信息响应回客户端(不调用doGet/doPost方法)6.若第一次访问有相关对象,则直接执行第5步7.长时间未调用,WEB容器会调用_jspDestroy()方法对jsp进行回收

    注释

    java格式注释 编译器会忽略掉此类注释中的内容(客户端的源码看不见)<%-- JSP注释,可多行 --%><%// java单行注释 %><%/* java 多行注释 */%><%/** java 文档注释 */%> html格式注释 编译器会执行注释中的代码(客户端的源码看得见)<!-- html格式注释 -->缺点:页面注释信息太多的时候会增大服务器的负荷,注释信息需在网络上传输从而降低效率且不安全

    指令元素(JSP标签)

    以<%@ 开始, 以%> 结束,用来设置整个JSP页面相关的属性(以键值对的形式存在,并用逗号隔开),如网页的编码方式和脚本语言指令元素主要有三种:page,include,taglib
    page指令
    <%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 在一个jsp文件中,至少有一个page指令元素,放在页面的最上面. 描述jsp页面的服务器端属性设置 常用属性 language=“java” //表示脚本中使用的编程语言contentType=“text/html; charset=UTF-8” //设置了内容的类型和静态页面的编码pageEncoding=“UTF-8” //页面本身的编码格式buffer=“8kb” //页面的缓存默认是8kbsession=“true” //相当于request.getSession(true)errorPage=“路径” //表示当前jsp发生服务器端错误的时进入此路径(路径里要有isErrorPage="true"属性)import //导入其他的包和类 <%@page import=“java.util.Date”%> //具体的包和类<%@page import=“java.sql.*”%> //包下的所有类<%@page import=“java.util., java.io., java.net.*”%> //连写,逗号分隔 session //指示当前的jsp是否参与会话(默认为true参与会话) <%@page session=“false”%> //与session不可会话
    Include指令
    <%@ include … %> 包含其他文件 把目标页面的内容放到当前页面,产生页面叠加以后的输出效果 常用属性 file=“路径” //导入目标页面路径
    Taglib指令
    <%@ taglib … %> 引入标签库的定义常用属性 uri=“uri” //确定标签库的位置prefix=“c” //指定标签库的前缀

    基础语法

    JSP的声明 <%! 代码 %>位于jsp转换为.java文件的service方法的外部,类的里面定义在产生的类文件中的类的属性和方法,也可声明内部类最先加载,可写于任何位置,无顺序 JSP代码段 <% 代码 %>位于jsp转换为.java文件的Service方法中书写Java语句、局部变量、输出或流程控制语句具有上下顺序 JSP表达式 <%= 代码 %>位于jsp转换为.java文件的Service方法中代码片断书写Java语言规范的表达式执行的顺序为从左到右,不能使用分号计算表达式的值,将值转换成String,用out.println发送标签,把数据输出至页面的当前位置

    动作元素

    动作元素在请求处理阶段起作用,为请求处理阶段提供信息,遵循XML元素的语法,利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码Include动作 形式:<jsp:include page=“url”> </jsp:include>等价于Servlet中通过RequestDispatcher.include()用来包含静态和动态的文件,该动作把指定文件插入正在生成的页面与include指令不同的是,include指令是在JSP文件被转换成Servlet的时候引入文件,而Include动作是在页面被请求的时候传参:<jsp:param name=“name” value=“value”/>属性 page:包含在页面中的相对URL地址flush:布尔属性,定义在包含资源前是否刷新缓存区 forward动作 形式:<jsp:forward page=“url”> </jsp:forward>等价于Servlet中通过RequestDispatcher.forward()该动作把请求转到另外的页面传参:<jsp:param name=“name” value=“value”/> //写在forward动作中 useBean动作 形式:<jsp:useBean id=“name” class=“完整包名”/>用来装载一个将在JSP页面中使用的JavaBean(Java组件) setProperty动作 形式:<jsp:setProperty name=“BeanIdName” property=“Bean属性名”/>设置已经实例化的Bean对象的属性,与useBean连用 getProperty动作 形式:<jsp:getProperty name=“BeanIdName” property=“Bean属性名”/>获得已经实例化的Bean对象的属性,转换成字符串,与useBean连用

    内置对象

    也称隐式对象,是JSP容器为每个页面提供的Java对象,可以直接使用 对象描述page当前类的当前对象等同于编译后的Servlet,类似于Java类中的this关键字pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问requestHttpServletRequest类的实例,Http请求对象responseHttpServletResponse类的实例,Http响应对象sessionHttpSession类的实例,会话对象applicationServletContext类的实例,定义全局属性,应用上下文configServletConfig类的实例,用于访问Servlet或者JSP引擎的初始化参数,需要在web.xml中,针对jsp进行配置outJspWriter类的实例,用于输出,往浏览器写内容exceptionException类的对象,包装了从先前页面中抛出的异常信息 范围对象 pageContext对象:主要用于存取属性,是page的上下文 Object getAttribute(String name, int scope) //获取name属性Enumeration getAttributeNamesInScope(int scope) //获取所有属性范围为scope的属性名称void removeAttribute(String name, int scope) //移除属性名称为name的属性对象void setAttribute(String name, Object value, int scope) //设置属性名称为name的属性对象Exception getException() //获取目前网页的异常,不过此网页要为error pageJspWriter getOut() //获取目前网页的输出流Object getPage() //获取目前网页的ServletServletRequest getRequest() //获取目前网页的请求ServletResponse getResponse() //获取目前网页的响应ServletConfig getServletConfig() //获取目前此网页的ServletConfigServletContext getServletContext() //获取目前此网页的执行环境(context)HttpSession getSession() //获取和目前网页有联系的会话(session) request对象:获取请求的来源、标头、cookies和请求相关的参数值等等 void setAttribute(String name, Object value) //设定name属性的值为valueEnumeration getAttributeNamesInScope(int scope) //获取所有scope范围的属性Object getAttribute(String name) //获取name属性的值void removeAttribute(String name) //移除name属性的值String getParameter(String name) //获取name的参数值Enumeration getParameterNames() //获取所有的参数名称String[] getParameterValues(String name) //获取所有name的参数值Map getParameterMap() //获取一个要求参数的MapString getHeader(String name) //获取name的标头Enumeration getHeaderNames() //获取所有的标头名称Enumeration getHeaders(String name) //获取所有name的标头int getIntHeader(String name) //获取整数类型name的标头long getDateHeader(String name) //获取日期类型name的标头Cookie[] getCookies() //获取与请求有关的cookiesString getContextPath() //获取Context路径String getMethod() //获取HTTP的方法String getProtocol() //获取使用的协议String getQueryString() //获取请求的参数字符串String getRequestedSessionId() //获取用户端的Session IDString getRequestURI() //获取请求的URL,但是不包括请求的参数字符串String getRemoteAddr() //获取用户的IP 地址String getRemoteHost() //获取用户的主机名称int getRemotePort() //获取用户的主机端口String getRemoteUser() //获取用户的名称void getCharacterEncoding(String encoding) //设定编码格式,用来解决窗体传递中文的问题 session对象:表示目前个别用户的会话 void setAttribute(String name, Object value) //设定指定名字的属性的值Object getAttribute(String name) //获取指定名字的属性的值void removeAttribute(String name) //删除指定名字的session属性void invalidate() //取消session对象,并将对象存放的内容完全抛弃String getId() //获取session的IDlong getMaxInactiveInterval() //获取最大session不活动的时间,若超过这时间,session将会失效void setMaxInactiveInterval(int interval) //设定最大session不活动的时间,若超过这时间,session将会失效long getCreationTime() //获取session产生的时间,单位是毫秒long getLastAccessedTime() //获取用户最后通过这个session送出请求的时间boolean isNew() //判断session是否为"新"的会话 application对象:存取ServletContext中的信息 int getMajorVersion() //获取Container主要的Servlet API版本int getMinorVersion() //获取Container次要的Servlet API版本String getServerInfo() //获取Container的名称和版本String getMimeType(String file) //获取指定文件的MIME类型ServletContext getContext(String uripath) //获取指定Local URL的Application contextString getRealPath(String path) //获取本地端path的绝对路径void log(String message) //将信息写入log文件中void log(String message, Throwable throwable) //将stack trace所产生的异常信息写入log文件中 其他对象 response对象:将处理数据后的结果传回到客户端 设定表头的方法void addCookie(Cookie cookie) //新增cookievoid addDateHeader(String name, long date) //新增long类型的值到name标头void addHeader(String name, String value) //新增String类型的值到name标头void addIntHeader(String name, int value) //新增int类型的值到name标头void setDateHeader(String name, long date) //指定long类型的值到name标头void setHeader(String name, String value) //指定String类型的值到name标头void setIntHeader(String name, int value) //指定int类型的值到name标头设定响应状态码的方法void sendError(int sc) //传送状态码void sendError(int sc, String msg) //传送状态码和错误信息void setStatus(int sc) //设定状态码String encodeRedirectURL(String url) //对使用sendRedirect()方法的URL予以编码 out对象:以字符流的形式输出数据 void clear() //清除输出缓冲区的内容void clearBuffer() //清除输出缓冲区的内容void close() //关闭输出流,清除所有的内容int getBufferSize() //获取目前缓冲区的大小(KB)int getRemaining() //获取目前使用后还剩下的缓冲区大小(KB)boolean isAutoFlush() //获取true表示缓冲区满时会自动清除;false表示不会自动清除并且产生异常处理 exception对象 getMessage() //获取异常信息getLocalizedMessage() //获取本地化后的信息printStackTrace(new java.io.PrintWriter(out)) //打印日志 config对象 String getInitParameter(name) //获取名称为name的初始参数的值Enumeration getInitParameterNames() //获取所有初始参数的名称集合ServletContext getServletContext() //获取ServletContext对象Sring getServletName() //获取编译后的Servlet名称

    表达式语言(EL)

    jsp默认就支持EL表达式,使得访问存储在JavaBean中的数据变得非常简单,为网页美工而设,使jsp趋向于html,EL不能进行逻辑处理,可以代替<%= 表达式%>代码部分

    语法 ${表达式} //表达式可为数字,字符串,布尔值,null用单引号或双引号定界 运算符 算术运算符:+, -,*,/(或 div),%(或 mod)关系运算符:==(或 eq),!=(或 ne),<(或 lt),>(或 gt),<=(或 le),>=(或 ge)逻辑运算符:&&(或 and),||(或 or),!(或 not)验证运算符:empty //${empty name} 变量和JavaBean属性数据输出 在范围对象中查找相应属性,而非直接在页面中查找实例或局部变量表达式语言查找变量的顺序是:pageContext→request→session→application //从小到大查找所有范围都未找到时,赋值null 存取器 []:输出对象属性值,输出数组或集合中对应索引值.:输出对象属性值 隐含对象 EL隐藏对象JSP隐藏对象pageScope/pageContextpageContextrequestScoperequestsessionScopesessionapplicationScopeappicationparamrequest.getParameter()paramValuesrequest.getParameterValues()headerrequest.getHeader()按照key-value的形式取出String类型值headerValuesrequest.getHeader()按照key-value的形式取出String类型的集合cookierequest.getCookies()initParam上下文初始化参数

    标准标签库(JSTL)

    JSTL是一个JSP标签集合,减少java代码,简化页面编写,封装了JSP应用的通用核心功能

    步骤 复制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib在使用jstl功能的jsp页面中增加指令 <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%> //核心标签库<%@taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml”><%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”><%@taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql”><%@taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions”>prefix表前缀(可改),uri 指向标签库的入口 核心标签 <c:out/> //在JSP中显示数据 value=“要输出的内容”default=“输出的默认值”escapeXml=“false” //是否忽略XML特殊字符 <c:set/> //设置变量值和对象属性 value //要存储的值target //要修改的属性所属的对象property //要修改的属性var //存储信息的变量scope //var属性的作用域 <c:remove/> //移除一个变量 var //要移除的变量名称scope //变量所属的作用域 <c:catch></c:catch> //处理产生错误的异常状况,并且将错误信息储存起来 var //用来储存错误信息的变量 <c:if></c:if> //判断表达式的值 var //用于存储条件结果的变量test //条件scope //var属性的作用域 <c:choose></c:choose> //相当于switch,<c:when></c:when> //相当于case,<c:otherwise></c:otherwise> //相当于default test //条件 <c:forEach></c:forEach> //相当于for循环 var //代表当前条目的变量名称begin //开始的元素end //最后一个元素step //迭代的步长items //要被循环的信息 <c:forTokens></c:forTokens> //与c:forEach相似 delims //分隔符,其他属性与上相同 <c:import/> //jsp:include功能相同 url //需要检索和引入的页面的URLcharEncoding //所引入的数据的字符编码集 <c:url></c:url> //将URL格式化为一个字符串,然后存储在一个变量中 value //基础URLcontext //本地网络应用程序的名称var //代表URL的变量名scope //var属性的作用域 <c:param> //指定c:url参数 name //URL中要设置的参数的名称value //参数的值 <c:redirect> //重定向至一个新的URL url //目标URLcontext //紧接着一个本地网络应用程序的名称
    Processed: 0.015, SQL: 9