JSP

jsp(javascript page)服务端脚本语言,用于写动态网页。就是可以在html中写java代码。

一个JSP页面是由传统的HTML页面标记加上JSP标记和嵌入的Java代码组成
由以下4种元素组成:HTML标记、JSP标记、JSP脚本和注释。

执行过程:

第一次访问:jsp -> java(servlet文件) -> .class
第二次访问:直接访问.class文件
tips: 所以第一次访问网页都比较慢,后面后好点了,如果服务端代码修改时,服务器会重新编译。

架构

CS:Client Server

BS:Browser Server
内容较多,可查看:cs和bs架构的区别

tomcat服务器

目录结构:

bin:可执行文件都放在这(startup.bat开启服务器 shutdown.bat关闭服务器)
只有开启了服务器才能够访问部署在tomcat的网页

conf:(configure)配置文件都放在这

lib:tomcat依赖的jar文件

log:日志文件

temp:临时文件

webapps:可执行的项目(一般我们的项目都放在这里面)

work:存放由jsp翻译成java以及编译后的class文件

常见状态码

200:一切正常

404:资源不存在

403:权限不足

3开头:重定向

5开头:服务器内部出错(一般是代码写错)

虚拟路径

先来看看conf/server.xml文件中常用的一些配置吧

很多人不知道去哪里看自己设置的端口号或者想要自己重新设置端口号,这里就可以解决你的问题!

那我们再来看看一张图:

所以我们在输入url的时候需要localhost:端口号/文件夹/文件名

<welcome-file-list>

服务器一开始是怎么知道哪些文件是默认文件的呢?

原来在WEB-INF/web.xml中设置了 默认的 初始页面

<welcome-file-list><!--你也可以添加一些默认的初始页面--><welcome-file>index.jsp</welcome-file><welcome-file-list>

当你输入localhost:端口号时,服务器会先在这里找文件,如果没有找到就404

JSP中写java代码

<%@ %>、<% %>,<%= %>,<%! %>跟<%-- --%>标签

<%@ 指令%>:指令标签,将有关页面的特殊处理信息传送到JSP容器,告诉容器如何处理JSP网页。
指令主要包括:page 指令include 指令taglib指令

page指令:用来定义和操作许多重要的依赖于页面的属性,这些属性影响整个JSP文件
语法:<%@ page 一些配置属性 %>
其属性:

  • language: 指定jsp页面使用的脚本语言
  • import: 导入类或包,导入多个时用,分割。如果不写该属性,JSP页面自动引入以下4个包:java.servlet.*; java.lang.*; java.servlet.http.*; java.servlet.jsp.*;
  • pageEncoding: 指定jsp文件本身的编码
  • contentType: 指定浏览器解析jsp的编码
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

include指令:引入静态资源文件。
语法:<%@ include file="relativeURL" %>
注意事项:

  • 可以让页面内容分成几个组成部分分别管理。
  • 被包含文件的URL路径一定是和发出指令的JSP页面相对的路径,即这些文件应该和当前JSP页面在同一个Web应用中。
  • 该指令采取的是静态插入方式,所谓静态插入,是指当前的JSP页面和被嵌入的文件合并成一个新的JSP页面,然后JSP引擎再将这个新页面转换成Servlet。

taglib指令:自定义指令
语法:<%@ taglib uri ="tagLibraryURI" prefix = "tagPrefix" %> 其中uri是用户自定义标记所在的标记库描述文件的url地址,prefix是标记库描述文件的前缀

有关自定义指令更详细的内容可自行百度。


<% %>:可编写java代码块以及定义局部变量

  1. 一个JSP页面可以有多个代码段,它们被JSP引擎按顺序执行,并且这些代码段之间可以插入一些标记元素。
  2. 在代码段中也可以声明变量,但这些变量是_jspService()中的局部变量,它们在JSP页面内所有代码段部分和表达式部分有效。
  3. 当客户请求一个JSP页面时,JSP引擎为每个客户产生一个线程,每个线程分别执行各自的_jspService()方法,因此一个客户对局部变量的操作不会影响其它客户。
<%  // 这里定义局部变量,常规java代码init(9);for(int i = 0; i < 3; i++){// 换行用<br/>out.print(i*i + "<br/>");
%>

<%= %> 称为输出表达式 功能与out.print()等价

<%=  // 可以在这里写一些简单的表达式"你好啊" + name
%>

<%! %> 一般在此定义/声明全局变量,方法

<%! public String name; public void init(int n){name = "codekiang" + n;}
%>

注意:out.print()以及输出表达式可以解析html标签


<%-- --%> 注释标签,网页中不可见。

<%-- <%@ page %> => page 指令--%>

到了这里,一些代码你就可以得心应手的写出来啦。那么如果遇到需要在java代码中写html标签那该怎么办呢?

我们可以这样做:

<%  // 这里定义局部变量,常规java代码for(int i = 0; i < 3; i++){out.print("哈哈哈")
%>
<h2>CodeKiang好帅</h2>
<% }%>

这是我们可以把java代码用<% %>分开来,中间写html标签。


注意项:以上出现的标签%跟其他符号之间都不能存在空格,如<%= %>以及<%! %>中的%跟!,=之间不要有空格!!

九大内置对象

jsp的九大内置对象(不用new就可以直接使用的对象)

out、request、response、session、application、page、pagecontent、config、exception

out:输出对象,向客户端输出内容


request:请求对象,存储“客户端向服务端发送的请求信息”,数据只在同一次请求有效

常见方法:

String getParameter(String name):根据请求字段名返回字段值

String[] getParameterValues(String name):根据字段名返回多个值

void setcharacterEncoding(“编码格式”):设置请求服务器时所用编码,如UTF-8

void getRequestDispacher(“路径”).forward(request,response):请求转发,即跳转到其他页面

Cookie[] get Cookies():获取多个cookie


response:响应对象

常见方法:

void addCookie(Cookie cookie):服务端向客户端增加cookie对象

void sendRedirect(“路径”):重定向

void setContentType(“编码格式”):设置服务端响应的编码,如text/html;charset=UTF-8

tips:重定向与请求转发的区别

重定向:数据丢失 地址跳转
请求转发:保留数据 并且仍然保留转发时的页面

session:会话对象,同一会话共享数据 (注意:cookie不是内置对象)

用户第一次访问服务端时会自动产生一个session对象(拥有唯一sessionID)和cookie,
此时cookie的name=JSESSIONID,value=sessionID的值
客户端的cookie跟服务端的session一一对应就是靠JSESSIONID跟sessionID进行匹配
若匹配失败则创建session对象。cookie和session的区别:session            cookie保存的位置       服务端          客户端安全性          较安全           较不安全保存的内容        Object          String

常用方法:
String getID():获取sessionID

boolean isNew():判断是否第一次访问

void invalidate():注销

boolean hasMoreElements() 判断session中是否还有元素

setMaxInactiveInterval(秒):设置最大非活动时间

int getMaxInactiveInterval(秒):获取最大非活动时间

void setAttribute(key,value) :设置属性

Object getAttribute(key) :获取属性


application:全局对象

常见方法:

Object getAttribute(String name):根据属性名获取属性值
void setAtrribute(String name,Object obj):新增属性
void removeAttribute(String name) :根据属性名删除属性


config:配置对象(如服务器位置信息)


page:当前JSP页面对象(相当于java的this)


pageContent:JSP页面的上下文,常用于调用其他内置对象

ServletResponse getResponse(): 获取response对象

ServletRequest getRequest(): 获取request对象

HttpSession getsession():获取session对象


exception:异常对象


四大范围对象(小->大):

  1. pageContent 当前页面有效
  2. request 同一请求有效
  3. session 同一会话有效
  4. application 全局有效

共有方法:
Object getAttribute(String name) 根据属性名获取属性值
void setAtrribute(String name,Object obj) 新增或创建
void removeAttribute(String name) 根据属性名删除属性


cookie:由服务端生成再发送给客户端保存,除了自定义的cookie之外,还有自带JSESSION的cookie

创建cookie对象:new Cookie(key,value)
获取key:getName()
获取值:getValue()
设置最大有效期:setMaxAge(int time)

JavaBean

与数据库操作时,通常会把需要操作的数据封装成一个javaBean。以提高代码的复用性和减轻jsp复杂度

javaBean定义(必须同时满足以下两点):

  1. public修饰的类,public修饰的无参构造
  2. 所有属性(如果有)都是private修饰,并且都提供了set跟get方法。(boolean:get替换成is)

javaBean分为两大类

  1. 封装业务逻辑的javaBean(Dao层)
  2. 封装数据的javaBean(实体类) 对应数据库的一张表

tips:

  1. xxxDao.java的一般是跟数据库操作有关的

  2. 如果jsp出现错误:The import xxx cannot be resolved
    尝试解决方案:
    1. 可能没有给类创建一个包,为其加入个包然后用的时候带上包名,即可解决问题。
    2. 可能是jdk、tomcat版本问题,右键项目->build path,将其中报错的libary删除后重新导入。
    3. 缓存问题,清空各种缓存即可。右键服务器->clean tomcat

MVC设计模式

目的:为了解耦合、提高代码复用

M (model):封装了对数据的操作,是与数据库交互的地方。一般是 JavaBean

V (view):负责界面的显示。一般是 JSP

C (controller):控制器负责视图和模型之间的转接,即将视图的处理请求分配给哪一个模型来处理。一般是 Servlet

Servelet

定义:(满足以下条件的Java类)

  1. 必须继承 javax.servelet.http.HttpServelet

  2. 重写其中的doGet()或doPost()方法

    doGet():接受并处理所有的get方式的请求
    doPost():接受并处理所有的post方式的请求

要想使用servelet必须进行以下配置

Servelet2.5:配置web.xml文件

<servelet><servelet-name>与servelet-mapping的servelet-name对应</servelet-name><servelet-class>处理请求的文件</servelet-class>
</servelet>
<servelet-mapping><servelet-name>与servelet的servelet-name对应</servelet-name><servelet-pattern>/请求提交的路径(注意不要忘了'/')</servelet-pattern>
</servelet-mapping>

Servelet3.0@WebServelet('/请求提交的路径')

tips:

  • web.xml的 / 代表 项目 根目录
  • jsp的 / 代表 服务器 根目录

JSP动作

JSP动作标记是JSP页面中使用的一种特殊的标记,它利用XML语法格式的标记来控制JSP引擎完成某种功能。

<jsp:include>:在页面被请求的时候引入一个文件

如:<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" /> 其中,page属性表示要包含的文件的相对地址,它可以是一个字符串,也可以是一个JSP表达式。flush属性默认为false,若为true则表示当缓冲区满时,缓冲区将被清空。

include指令和include 动作区别 (1)嵌入的内容。include指令嵌入的是静态的文本或页面,而include动作包含的可以是静态或动态内容。 (2)嵌入被包含页面的时间。include动作在处理请求时才将被包含页面嵌入进来,而include指令是在JSP文件被转换成Servlet的时候引入文件。 (3)共享局部变量。用include动作时,在页面中声明的变量不可用于另一文件;而在用include指令时,当前页面和被包含页面可以共享变量。 (4)修改的生效时间。用include指令时,修改的生效需刷新页面或去掉已经编译成的Servlet;而用include动作时,被包含页面的修改会随时生效。 (5)变量名冲突。用include指令时注意新生成的JSP页面要符合JSP语法要求,应该避免变量名的冲突。而用include动作不存在变量名冲突问题

<jsp:param>:提供了“名称——值”信息,用于将附加在request中的参数发送至转发的页面。
语法:<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" /> name属性指定参数的名称,value属性指定参数的值。

还可与 <jsp:include><jsp:forward><jsp:plugin> 标记一起使用。

<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" ><jsp:param name="paramName" value="paramValue|<%=expression%>" />
</jsp:include>

<jsp:forward>:把请求转到一个新的页
语法:<jsp:forward page={"relativeURL" | "<%= expression %>"} />

使用<jsp:forward>标记时,JSP页面必须使用缓冲机制,不能将page指令中的buffer属性设为none。否则它将清空缓存里的内容,浏览器里将得不到任何输出。

tips:一旦JSP页面中加入<jsp:forward>,则它之后的程序将无法执行 ,<jsp:forward>标记将停止当前页面的处理而转向目标页面。

<jsp:plugin>:根据浏览器类型为Java插件生成OBJECT或EMBED标记
<jsp:useBean>:寻找或者实例化一个JavaBean
<jsp:setProperty>:设置JavaBean的属性
<jsp:getProperty>:输出某个JavaBean的属性


EL和JSTL

EL:Expression Language操作符:点操作符     .   --使用方便中括号   []  --功能强大;属性名可以包含特殊字符(.、-)语法:${ 域对象.属性/key } 或 ${ 域对象["属性/key"] }可以是单引号      等价于<%= %>关系运算符: >(gt) >=(ge) ==(eq) <(lt) <=(le) !=(ne)例:${ 2>1 } 或${ 2 gt 1 } 结果为true逻辑运算符:||(or) &&(and) !(not)Empty运算符:判断值是否为null,若是则为true例:${Empty a.b } 隐含对象:作用域对象:pageScope、requestScope、sessionScope、applicationScopetips:如果不指定作用域对象,则默认从小范围到大范围找参数对象:获取表单数据/超链接的参数${ param.属性名 } 获取单个参数${ paramValues.属性名 } 获取多个参数JSP隐式对象:可以通过pageContent获得JSP的其他隐式对象例:${ pageContent.session } 得到Seesion对象  与JSP的pageContent.getSession()等价${ pageContent.response } 得到response对象 与JSP的pageContent.getResponse()等价

JSTL:需要引入两个jar包(JSTL.jar standard.jar)然后引入tablib:<%@ taglib prefix="前缀名" uri="http://java.sun.com/jsp/jstl/core"%> 核心标签库:通用标签库、条件标签库、迭代标签库通用标签库:set标签:赋值操作在某个作用域中给变量赋值 <前缀:set var="变量名" value="变量值" scope="作用域对象"  /> 等价于 setAttribute("","")在某个作用域中给对象赋值 <前缀:set target="对象" proprety="属性名" value="值" />例:<c:set target="${request.student}" proprety="属性名" value="值" />tips:set标签可以给不存在的变量赋值。out标签:输出操作<前缀:out value="要输出的值" default="" escapeXml="true"  />default:当value为不存在的数据时,输出defaultescapeXml:默认true。 为false时value可以显示html代码remove标签:删除变量<前缀:remove var="" scope="">条件标签库:if标签:<前缀:if test="${表达式}" var="结果值">为真时显示我</前缀:if>choose标签:<前缀:choose><前缀:when test=""></前缀:when><前缀:when test=""></前缀:when><前缀:otherwise></前缀:otherwise></前缀:choose>tips:test里面的${}的后面不要有空格迭代标签库:forEach标签:同java的for<前缀:forEach begin="" end="" step=""></前缀:forEach>例://for(int i=0;i<5;i++){ System.out.print(111) }<c:forEach begin="0" end="5" step="1">111</c:forEach>//for(int name : names){ System.out.print(name) }<c:forEach var="name" items="names">${ name }</c:forEach>

过滤器

如果要想给一个普通的class变成一个具有特定功能的类(过滤器、拦截器等),要么继承父类,要么实现接口,要么添加注解。

  1. 过滤器需要实现Filter接口

  2. 需要实现的方法:

    init:初始化时执行

    doFilter(ServeletRequest request,ServletResponse response,chain):处理拦截操作

    ​ 过滤器放行chain.doFilter(request,response)

    ​ 与Servlet中方法的参数:HttpServeletRequest

    destroy:销毁时执行

  3. 配置web.xml(类似于servlet)

    <filter><filter-name></filter-name><filter-class></filter-class>
    </filter>
    <filter-mapping><filter-name></filter-name><url-pattern>/需拦截的路径,为*时全拦截</url-pattern><dispatcher>通配符请求:只拦截通配符设置的请求</dispatcher>
    </filter-mapping>常用通配符:
    REQUEST:拦截http请求(get、post)
    FORWORD:只拦截请求转发的请求
    

特点:

  1. 请求跟响应时都会被过滤器拦截。
  2. 需要过滤器放行

过滤器链

当有多个过滤器时,需配置多个 <filter-mapping> ,而过滤器的先后顺序由<filter-mapping>的位置决定

监听器

监听的对象:request、session、application

监听步骤:

  1. 编写类,实现接口

  2. 配置web.xml

    <listener><listener-class>类名的限定名</listener-class>
    </listener>
    

监听对象的创建和销毁:

request:ServeletRequestListener

session:HttpSessionListener

application: ServletContextListener

每个监听器各自提供了两个方法:监听开始和监听结束

监听对象中属性的变更:

request:ServletRequestAttributeListener

session:HttpSessionAttributeListener

application:ServletContextAttributeListener

每个监听器各自提供了三个方法:监听属性增加、属性更改、属性删除

xx.setAttribute("object",ob)触发对应的attributeAdded事件
xx.removeAttribute("object")触发对应的attriubteRemoved事件
xx.replaceAttribute("object",obs)触发对应的attributeRepalced事件

session的四种状态

  1. 钝化:把session对象从内存放进硬盘

  2. 活化:把session对象从硬盘放进内存

    操作:1.实现HttpSessionActionListener和Serializable2.配置tomcat目录/conf/context.xml<Manager className="指定的Manager类名"><Store className="指定的FileStore类名"                              directory="session存放位置"></Store></Manager>提供了钝化之前、活化之后的监听方法。实质:序列化、反序列化。需要继承Serializable
    钝化和活化不需要配置web.xml
  3. 绑定:session.setAttribute(“user”,user),触发valueBound事件

  4. 解绑:session.removeAttribute(“user”),触发valueUnbound事件;session失效或 超时。

    操作:1.实现HttpBindingListener2.不需要配置web.xml提供了session对象的绑定对象、解绑对象时的监听方法。this跟event区别:
    this:绑定的对象
    event:绑定了对象的session
    

tips:

  • 只有实现了HttpSessionBindingListener的类,在和session绑定、解除绑定时触发其相关事件。
  • 实现了HttpSessionAttributeListener后,任何对象(不论其是否实现了AttributeListener)在变化时均触发对应的事件

Ajax

使用jquery方式使用ajax

$.ajax({url:"服务器地址",type:post|get,data:"请求数据",success:function(result,testStatus){result为返回的结果,testStatus为状态码},
})
$.get({url:"服务器地址",data:"请求数据",function(result){},dataType:"test"|"json"|"xml"
})$.post({url:"服务器地址",data:"请求数据",function(result){},dataType:"test"|"json"|"xml"
})
$("显示结果信息的元素").load({"服务器地址","请求数据",
})
$.getJson({"服务器地址",json格式的请求数据
})

JavaWeb学习(较全较简)相关推荐

  1. JavaWeb学习之路——SSM框架之Mybatis(三)

    数据库配置和相关类创建看上篇:JavaWeb学习之路--SSM框架之Mybatis(二) https://blog.csdn.net/kuishao1314aa/article/details/832 ...

  2. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)

    javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...

  3. 【Javaweb学习笔记】在Eclipse中创建Web项目

    [Javaweb学习笔记]在Eclipse中创建Web项目 哈喽大家好,这里是Java框架学习笔记专栏第二期 本期内容--在Eclipse中创建Web项目 前期回顾: 第一期--schema约束 笔者 ...

  4. java web孤傲苍狼,JavaWeb学习笔记

    我看的资料是孤傲苍狼的javaweb学习笔记,他写的真的很全,这或许就是社区力量吧!哪些问题不知道,上网搜一搜就有了,让自己不进步的敌人,只有懒惰了. 这是我接触JavaWeb的第二周,有一些自己的理 ...

  5. JavaWeb学习笔记(数据库、SQL语句、数据查询语法、完整性约束、编码、备份和恢复数据、多表查询)

    数据库.SQL语句.数据查询语法.完整性约束.编码.备份和恢复数据.多表查询 JavaWeb学习笔记 数据库 数据库概念 基本命令 启动和关闭mysql服务器 客户端登录退出mysql SQL语句 S ...

  6. JavaWeb学习--复习

    JavaWeb学习 JavaWeb--Html 1.提交按钮 <button οnclick="alert('你好')">提交</button>,oncli ...

  7. JavaWeb学习笔记(十)--HttpServletRequest

    1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...

  8. 两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享

    两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享   在当前社会,技术日新月异,一个全栈工程师不及时学习新知识,掌握AI技能,再过两年就算不上"全栈"了. 产品发烧友.前端 ...

  9. NLP中的自监督表示学习,全是动图,很过瘾的

    作者:amitness 编译:ronghuaiyang 原文链接: NLP中的自监督表示学习,全是动图,很过瘾的​mp.weixin.qq.com 其实在自监督学习的概念提出之前,NLP中就已经运用到 ...

  10. python零基础入门教程视频下载-Python零基础入门学习视频教程全42集,资源教程下载...

    课程名称 Python零基础入门学习视频教程全42集,资源教程下载 课程目录 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小 ...

最新文章

  1. C++中try/catch/throw的使用
  2. 创建第一个vue实例
  3. AssetBundle
  4. 玩转Linux必备知识(四)
  5. Java Web学习总结-文件下载
  6. Spring Boot----Dubbo
  7. 我精心珍藏的Python代码技巧
  8. Mono SVN最新代码或者Mono 1.2.5 支持IronPython 2.0
  9. 奢华还是土嗨?8848新品钛金手机将于3月29日开启预售
  10. python pyqt教程_『开发技巧』PyQt5入门教程
  11. suse 11添加阿里源
  12. Linux有道词典依赖问题
  13. android中timepicker 常用属性,Android中实现日期时间选择器(DatePicker和TimePicker)
  14. JQuery图片跟随鼠标移动
  15. mono android 开机启动,浅析 Android 平台 mono执行机制 by郡墙
  16. 服务端使用GZIP压缩数据
  17. python调用bitly api出错
  18. 守望先锋服务器修改,守望先锋开发者访谈:关于自定义的服务器
  19. python代码下出现红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...
  20. git 源码安装后报错/usr/bin/git: No such file or directory

热门文章

  1. arduino并口屏_74HC595等串口转并口芯片的Arduino实用封装
  2. 稳定,大容量,不限文件大小,无流量限制的网盘
  3. Fastjson存在0day漏洞
  4. 蓝桥02 等差素数列 ——数论知识
  5. 数据分析 超市条码_京东超市11.11酒类1分钟成交额破亿 持续夯实行业领先优势...
  6. matlab信号如何加白噪声,matlab给信号加白噪声
  7. Linux就业技术指导:简历项目经验示例
  8. winform 企业ERP管理系统源码 c# C/S
  9. python毕业论文答辩ppt_如何制作优秀的毕业论文答辩 PPT?
  10. 前端页面预览word_页面预览Word