程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(1)

JavaWeb之jsp

发布于2021-05-29 21:32     阅读(1415)     评论(0)     点赞(27)     收藏(2)


一、jsp概述

动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

使用Servlet通过字符串拼接的方式输出静态网页是一件十分痛苦的事情,为了弥补Servlet的这种缺陷,SUN公司在Servlet的基础上推出了jsp(Java Server Pages)技术。

jsp是简化Servlet编写的一种技术,它可以让Java代码和HTML语句混合在同一个文件中编写

  • jsp只对网页中的要动态产生的内容采用Java来编写,对固定不变的静态内容采用HTML页面的方式编写
  • jsp页面是由HTML语句 (输出静态部分) 和 Java代码(输出动态部分) 组成的文件,其后缀名为.jsp

jsp的本质是一个Servlet。

二、jsp与servlet的优缺点

sevlet

  • 优点:编写java特别方便
  • 缺点:使用response.getWriter().print("页面")方式生成HTML页面特别繁琐和复杂

jsp

  • 优点:jsp的出现消除了在servlet中写html代码的复杂性
  • 缺点:把所有的java代码都在jsp中编写的话,可维护性差

三、jsp快速入门

3.1 jsp执行原理

tomcat会把jsp文件,先翻译成.java文件,再编译成.class文件,最后运行的是这个.class文件。整个的过程,在idea虚拟目录中的work目录中完成。
在这里插入图片描述

我们编写的jsp编译成的.class继承了HttpJspBase,而HttpJspBase继承了HttpServlet,所以说jsp本质就是一个Servlet。

3.2 jsp基础语法

3.2.1 脚本

Jsp通过脚本方式来定义java代码,脚本就是JSP中用来书写java代码的部分,主要有三种写法:

脚本片段

语法: <% Java代码 %>
作用:编写逻辑Java代码,这里面编写的代码, 编译之后会直接出现在servlet的service()方法中

脚本声明

语法: <%! java代码 %>
作用:声明全局变量和方法,这里面编写的代码,编译之后会出现在servlet的成员变量位置

脚本表达式

语法:<%= java代码 %>
作用: 向页面输出字符,这里面编写的代码, 编译之后会直接出现在servlet的service()方法中的out.print("")内

3.2.2 注释

<%-- 注释内容 --%>`
注释html代码和java代码脚本

注释作用范围:

注释jsp源码java源码html源码
html注释可见可见可见
java注释可见可见不可见
jsp注释可见不可见不可见

3.2.3 三大指令

  • page
  • include
  • taglib

3.3 隐式对象

隐式对象:在jsp中已经声明好了(_jspService定义好的变量),可以直接在页面上使用的对象。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

隐式对象特点

  • 可以在jsp中不声明,直接使用
  • 不是真的不声明,而是在jsp中看起来像没有声明
  • 前四个对象都可以用来共享数据,它们存取数据的范围从小到大依次是:pageContext < request < session < application
  • pageContext的作用有3个:
    1) 当前页面共享数据 2) 获取其它八个内置对象 3)可以操作4个域对象的数据

3.3.1 PageContext页面域

PageContext是javax.servlet.jsp.JspContext的子类,也在javax.servlet.jsp包下;它可以获取其他8个隐式对象,同时它也是一个域对象,称为页面域。

页面域作用范围:就在当前页面,出了当前页面就用不了了。

PageContext不仅可以操作页面域,还可以操作其他三个域。

3.4 表达式语言(Expression Language)

3.4.1 EL概述

jsp嵌套java代码,使用脚本元素 ,太复杂现在已经淘汰,所以现在在JSP中不允许出现Java代码。

现在我们使用表达式语言(Expression Language),主要用来简化jsp中对java代码的操作。

EL可以从jsp的域对象中获取数据,还可以执行一些简单的计算。

语法: ${表达式}

  • ${pageScope.键名} 从page域中获取指定键名对应的值
  • ${requestScope.键名} 从request域中获取指定键名对应的值
  • ${sessionScope.键名} 从session域中获取指定键名对应的值
  • ${applicationScope.键名} 从application域中获取指定键名对应的值
    简化写法:
  • ${键名}:从最小域到最大域依次查找,若找到,立即返回且终止查找;若没有找到,返回""

细节:

  • 没有空指针异常
  • 没有数组下标越界
  • 没有字符串拼接

3.4.2 存储数据

往域中放入的数据的时候,尽量不要在属性名中使用.和数字

      //引用数据类型 string  int
        request.setAttribute("str" , "第一个存入的字符串" );
        request.setAttribute("num" , 123.123 );

        //2.存数组
        String [] arr={"jack" , "rose" , "tom" , "jerry"};
        request.setAttribute("arr" , arr );

        //3.存对象(javaBean)
        request.setAttribute("user" , new User("小明","1234" , 18));

        //4.list集合
        List<String> strList = new ArrayList();
        strList.add("我");
        strList.add("爱");
        strList.add("Java");
        request.setAttribute("strList" , strList);

        //5.map集合
        Map<String , String > map = new HashMap<>();
        map.put("key1" , "value1");
        map.put("key2" , "value2");
        map.put("key3" , "value3");
        map.put("key4" , "value4");
        request.setAttribute("map" , map);

3.4.3 读取数据

  • 简单类型:${键名}
  • 对象类型:${键名.属性名 去掉get首字母小写}
  • 单列集合类型:${键名[索引]}
  • 双列集合类型:${键名[“key”]}
<h1>演示获得字符串数据</h1>
    ${str}<br/>
    ${num}<br/>
<h1>演示获得数组</h1>
    <%--${数组[索引]}--%>
    ${arr}${arr[1]}
<h1>演示获得对象</h1>
    <%--${对象.去掉get首字母小写}--%>
    ${user.username2}
<h1>演示获得list</h1>
    <%--${集合[索引]}--%>
    ${strList}${strList[1]}
<h1>演示获得map集合</h1>
    <%--${map集合['key']}  map.get("key")--%>
    ${map['key1']}

3.4.4 执行运算

  • 算数运算符
    语法: + - * / %
  • 比较运算符
    语法:> < >= <= == !=
  • 逻辑运算符
    语法:&& || !
  • 三元运算符
    语法:${条件表达式?为真:为假}
  • 空运算符
    语法:${not empty 对象}
    功能:
    用于非空判断,
    判断一个字符串是否为null或者""
    判断一个集合或者数组的长度是否为0
    判断一个对象是否为null

3.4.5 使用细节

  1. 没有空指针异常
  2. 没有数组下标越界
  3. 没有字符串拼接

3.5 Jsp标准标签库

3.5.1 JSTL概述

Jsp 标准标签库(Jsp Standard Tag Library),是由Apache组织提供的开源的jsp标签库,本质是含一定逻辑的标签,作用是在页面做判断和循环操作。

JSTL标准标签库有5个子库,但随着发展,目前常使用的是它的核心库 core

标签库标签库的URI前缀
Corehttp://java.sun.com/jsp/jstl/corec

3.5.2 core中常用标签

  • c:if
    if标签用于单分支条件判断,相当于Java中的if(条件){}的用法,它的常见用法:

<c:if test=“条件”>
条件成立的逻辑
</c:if>

  • c:foreach
    forEach用于循环遍历,常见属性:

begin:循环的开始,默认为0
end: 循环的结束,默认为items的length
var: 循环过程中的临时变量
step: 设置步长 ,默认为1
items:指定要循环的对象,支持el表达式,可以从四大域中获取集合
varStatus:遍历的状态

count:表示当前遍历的是第几个,从1开始
index:表示当前遍历的索引,从0开始

3.5.3 JSTL的使用

  1. 导入jar包 javax.servlet.jsp.jstl.jar包和jstl-impl.jar
  2. 在使用的页面中通过<%@taglib prefix="标签前缀" uri="标签库的uri"%>导入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

四、MVC模式

4.1 MVC概述

MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的开发思想。

  • M: Model(模型),除了servlet之外其他的实体类用来处理业务逻辑或者封装数据
  • V: View(视图),目前jsp就是视图,用于展示数据的,擅长展示动态内容
  • C: Controller(控制器),目前servlet就是控制器,用于接收和响应来自客户端的请求

MVC优点:

  • 降低耦合性(代码的关联度),方便维护和拓展,利于分工协作
  • 复用性强

MVC缺点:

  • 使得项目架构变得复杂,增强了开发难度,对开发人员的能力要求比较高

4.2 三层架构

三层架构是对mvc模式的一种细化,它将Model进一步分为service层和dao层,以后在开发中都会遵循三层架构。
在这里插入图片描述

4.3 包目录结构

每一个项目的第一层基础包是公司域名倒写,如com.baidu

com.baidu 公司域名倒写
com.baidu.web       web层的内容
com.baidu.service	  service层代码(业务逻辑层)
com.baidu.dao       数据库访问层
com.baidu.domain 	  存放实体类
com.baidu.utils 	  存放工具类: 不需要new 也能使用的类 存放一些静态方法

复杂的层次结构:

com.baidu 公司域名倒写
com.baidu.项目名称   公司域名倒写
com.baidu.项目名称.web       web层的内容
com.baidu.项目名称.web.servlet        web层的内容
com.baidu.项目名称.web.filter         web层的内容
com.baidu.项目名称.web.listener       web层的内容
    
com.baidu.项目名称.service	      service的接口层
com.baidu.项目名称.service.impl	  service的实现类层
com.baidu.项目名称.dao            数据库访问层 , 接口层
com.baidu.项目名称.dao.impl       数据库访问层 , 实现类层
com.baidu.项目名称.domain 	  存放实体类
com.baidu.项目名称.exception    异常处理
com.baidu.项目名称.constant     常量池
com.baidu.项目名称.utils 	  存放工具类: 不需要new 也能使用的类 存放一些静态方法

注意:包名全部小写

原文链接:https://blog.csdn.net/tysearch/article/details/117200971



所属网站分类: 技术文章 > 博客

作者:小泽圈儿郎

链接:http://www.javaheidong.com/blog/article/207439/89b66dfc02f9ff9bf666/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)