热门关键字:
jquery > jquery教程 > jquery教程 > JSP入门基础知识详细版(通俗易懂)

JSP入门基础知识详细版(通俗易懂)

269
作者:管理员
发布时间:2021/1/25 20:06:09
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=3461
  什么是JSP?


  JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML


  和Java代码共同存在!


  为什么需要JSP?


  JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的


  JSP还有必要学吗?


  在MVC中,JSP属于展示层,但是JSP却又可以写一定的业务,甚至跑去做数据层的事情,这样开发中就会变得无比混乱,也增加了开发的困难程度,所以将展示层与业务层分开就成为了主流,也就是我们说的前后端分离,但是事无绝对,确实一些比较老的项目仍然在跑jsp,不管你会不会写,你总得碰到能看懂吧,如果已经接近找工作,确实还是以比较流行的技术学习比较好,但是若作为学生,时间还是比较富裕的,很多本科也必然都会讲,学习一下也是挺好的,况且JSP与Servlet也是息息相关的,我认为,学它就是为了知道为什么以后会用别的技术代替它(狗头保命),废话有点多了,还是有一点需要的朋友可以简单看一看,希望给你能有一点帮助


  Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。为什么说JSP本身就是一种Servlet呢?


  其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)


  编译过程是这样子的:


  浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。


  以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。


  既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了


  有人可能也会问:JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中


  JSP也是Servlet,运行时只有一个实例,JSP初始化和销毁时也会调用Servlet的init()和destroy()方法。另外,JSP还有自己初始化和销毁的方法


  作用:用于配置JSP页面,导入资源文件


  格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %>


  contentType:相当于response.setContentType()


  设置响应体的mime类型以及字符集


  设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)


  import:导包


  errorPage:当前页面发生异常后,会自动跳转到指定的错误页面


  isErrorPage:标识当前也是是否是错误页面


  true:是,可以使用内置对象exceptionfalse:否。默认值。不可以使用内置对象exception


  JSP行为(JSP Actions)是一组JSP内置的标签,只书写少量的标记代码就能够使用JSP提供丰富的功能,JSP行为是对常用的JSP功能的抽象和封装。


  JSP内置的标签称之为JSP行为,是为了能够和JSTL标签区分开来。(叫做JSP标签也行)


  上面已经提及到了,include指令是静态包含,include行为是动态包含。其实include行为就是封装了request.getRequestDispatcher(String url)。include(request,response)


  include行为语法是这样的:


  jsp行为包含文件就是先编译被包含的页面,再将页面的结果写入到包含的页面中(1.jsp)


  当然了,现在有静态包含和动态包含,使用哪一个更好呢?答案是:动态包含。


  动态包含可以向被包含的页面传递参数(用处不大),并且是分别处理包含页面的(将被包含页面编译后得出的结果再写进包含页面)


  【如果有相同名称的参数,使用静态包含就会报错!】!


  当使用行为引入或将请求转发给其它资源时,可以使用行为向这个资源传递参数


  在Servlet中我们使用request.getRequestDispatcher(String url)。forward(request,response)进行跳转。其实forward行为就是对其封装!


  我们来看一下forward的语法


  如果我要传递参数,就要在forward行为嵌套param行为


  在跳转到head.jsp时传入参数username值为aaa


  directive的中文意思就是指令。该行为就是替代指令的语法的


  使用该指令可以让JSP页面更加美观!


  使用scriptlet行为替代<%%>是同样一个道理


  JSP还提供了操作javaBean对象的行为,暂时记住JSP提供了javaBean行为来操作简单类即可!后面详细解释:


  JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用


  到目前为止,我们已经学了4种属性范围了。


  page【只在一个页面中保存属性,跳转页面无效】


  requet【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】


  session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】


  application【在整个服务器中保存,所有用户都可以使用】


  4个内置对象都支持以下的方法:


  setAttribute(String name, Object o )getAttribute(String name)removeAttribute(String name)


  ※ 应用场景


  request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐servletContext:如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在servletContext域中,像聊天数据


  avaBean就是一个普通的java类,也称之为简单java对象--POJO(Plain Ordinary Java Object),是Java程序设计中一种设计模式,是一种基于 Java 平台的软件组件思想


  JavaBean遵循着特定的写法,通常有以下的规则:


  有无参的构造函数


  成员属性私有化


  封装的属性如果需要被外所操作,必须编写public类型的setter、getter方法


  上面的文字看起来好像很高大上,javaBean其实非常简单,常见的学生类,书籍类就是按照特定写法、规则编写的一个JavaBean对象


  为什么需要使用Javabean


  使用javaBean的好处:封装,重用,可读!


  JaveBean你可以理解为一辆货车,在你的java端和web页面进行数据传递的载体,你当然可以每个变量单独传递,或者使用集合传递,但是javabean可以使你的数据更有可读性,方便开发时明确变量的意义,也使其他阅读你代码的人能直接你的意图


  如果bean类与数据库联合使用,一张表使用bean类,可以使你的代码更加简洁高效,易于理解,现在大多数框架都会使用这种机制。


  JSP行为--JavaBean


  JSP技术提供了三个关于JavaBean组件的动作元素,即JSP行为(标签),它们分别为:


  ※ JSP:useBean


  标签用于在指定的域范围内查找指定名称的JavaBean对象:


  存在则直接返回该JavaBean对象的引用。


  不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。


  语法:


  果JSP不支持这个行为,我们要使用Person类是这样使用的


  但是我们使用就非常整洁,不用导包,不用new对象


  JavaBean中无参的构造函数改成有参的,会出现异常,这是因为


  的内部原理是 new了一个无参的构造函数


  ※ JSP:setProperty


  四种模式


  当我们没有学习到时,我们获取表单的信息,然后导入到javaBean对象中是这样的一种情况:


  而我们使用后,代码更少,功能更强大


  代码少很直观的可以看出来,但是强大在什么地方呢?


  表单提交过来的数据都是字符串,在我们没有用前,我们存储设置int类型或其他非字符串类型的数据是需要强转的!但是不需要我们强转,它内部自动帮我们转换了!


  下面再通过自动匹配来感受它的强大


  为什么Property的值可以将表单传递过来的数据封装到JavaBean对象中?


  JavaBean属性名要和表单的name的名称一致


  是通过反射来做的,调用了内省的方法!


  ※ JSP:getProperty


  EL:Expression Language 表达式语言


  它的作用就是替换和简化jsp页面中java代码的编写


  EL表达式支持简单的运算符:加减乘除取摸,逻辑运算符。empty运算符(判断是否为null),三目运算符


  empty运算符可以判断对象是否为null,用作于流程控制!


  三目运算符简化了if和else语句,简化代码书写


  EL表达式主要是来对内容的显示,为了显示的方便,EL表达式提供了11个内置对象


  EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能


  开发HTML转义的EL函数


  我们有时候想在JSP页面中输出JSP代码,但是JSP引擎会自动把HTML代码解析, 输出给浏览器。此时我们就要对HTML代码转义。


  步骤:


  编写一个包含静态方法的类(EL表达式只能调用静态方法),该方法很常用,Tomcat都有此方法,可在webappsexamplesWEB-INFclassesutil中找到


  在WEB/INF下创建tld(taglib description)文件,在tld文件中描述自定义函数


  在JSP页面中导入和使用自定义函数,EL自定义的函数一般前缀为"fn",uri是"/WEB-INF/tld文件名称"


  由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。其实EL函数库就是fn方法库,是JSTL标签库中的一个库,也有人称之为fn标签库,但是该库长得不像是标签,所以称之为fn方法库既然作为JSTL标签库中的一个库,要使用fn方法库就需要导入JSTL标签!要想使用JSTL标签库就要导入jstl.jar和standard.jar包!所以,要对fn方法库做测试,首先导入开发包(jstl.jar、standard.jar)


  在JSP页面中指明使用标签库


  JSTL全称为 JSP Standard Tag Library 即JSP标准标签库


  JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理、数据的格式化等等!


  EL表达式可以很方便地引用一些JavaBean以及其属性但是仍然不够完美,它不能遍历集合,做逻辑的控制。


  Scriptlet的可读性,维护性,重用性都十分差!JSTL与HTML代码十分类似,遵循着XML标签语法,使用JSTL让JSP页面显得整洁,可读性非常好,重用性非常高,可以完成复杂的功能!


  在JSP中不推荐使用scriptlet输出,推荐使用JSP标签


  导入jstl相关jar包引入标签库:taglib指令:使用标签


  core标签库是JSTL的核心标签库,实现了最基本的功能:流程控制、迭代输出等操作!


  core标签库的前缀一般是c


  常用的三个JSTL标签


  属性:


  test 必须属性,接受boolean表达式


  如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容


  注意:c:if 标签没有else情况,想要else情况,则可以在定义一个c:if标签


  它相当于java代码的switch语句


  使用choose标签声明,相当于switch声明


  使用when标签做判断,相当于case


  使用otherwise标签做其他情况的声明,相当于default


  forEach为循环标签,相当于Java中的while和for


  之前我们在使用EL表达式获取到集合的数据,遍历集合都是用scriptlet代码循环,现在我们学了forEach标签就可以舍弃scriptlet代码


  向Session中设置属性,属性的类型是List集合


  向Session中设置属性,属性的类型是List集合


  遍历session属性中的List集合,items:即将要迭代的集合。var:当前迭代到的元素


  Map对象有稍微地不一样保存的不是每个迭代的对象,而是Map.Entry




如果您觉得本文的内容对您的学习有所帮助:支付鼓励



关键字:jquery
友荐云推荐