WebDay14 JSP&MVC

一 JSP

1.1 概述

​ 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。 为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)

​ JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,页面动态资源使用java代码,页面静态资源使用html标签。

简单来说:可以在html标签中嵌套java代码

作用:简化书写,展示动态页面

1.2 快速入门

感知 : jsp 是 html上写java

​ 在jsp页面,动态展示当前时间

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <h1>jsp入门</h1>
        <div>
             <%
                 System.out.println("xx");

                 Date date = new Date();
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd,HH-mm-ss");
                 String format = sdf.format(date);
                 out.print(format); //在网页上输出
             %>
        </div>
</body>
</html>

``

1.3 工作原理

JSP本质上就是一个Servlet

# JSP运行原理
0. 查看流程
    a. 运行看tomcat日志输出 
            1). Using CATALINA_BASE:   "C:\Users\spy\.IntelliJIdea2018.2\system\tomcat\_class107"
            2). 然后到这个目录下查看路径 work\Catalina\localhost\ROOT\org\apache\jsp
            3). 找到index.java(继承自org.apache.jasper.runtime.HttpJspBase) 和 对应的class文件
    b. 查找HttpJspBase(实现自HttpServlet)
            1). 在tomcat安装路径下查看lib目录有个jasper.jar复制出来
            2). 用压缩软件打开找到这个HttpJspBase.class文件
            3). 拖进idea反编译
1. JSP运行流程:
		1). 前端请求JSP页面
		2). 服务器操作
			1. JSP页面JSP页面被tomcat翻译成Servlet
			2. HTML代码:被Servlet以response对象拼接字符串的形式输出
			3. java代码:在Servlet中被原样保留
		3). 服务器响应 
	
2. JSP本质:是一个Servlet

在这里插入图片描述

1.4 脚本和注释

1.4.1 脚本

JSP通过脚本方式来定义java代码

1. <% 代码 %>
		脚本片段,生成在service方法中,每次请求的时候都会执行
		
2. <%! 代码 %>
		声明片段,在java代码中声明成员,放在jsp生成java文件中的成员位置

3. <%=代码 %>
		输出脚本片段,相当于out.print("代码") 方法,输出到jsp页面
<%@ page import="java.io.PrintWriter" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <div>
                <%--
                    jsp三种脚本
                    1. <%  java代码  %>
                           a. servlet的service方法中
                           b. out是jsp内置对象(人家已经创建好了,我们直接使用就可以了)
                                1). 作用:  out.print("out: 网页上输出");
                                2). 跟 PrintWriter writer = response.getWriter(); 差不多
                                3). writer比out快, 所以后写先输出
                               因为servlet中默认使用out,推荐用out

                    2. <%= 内容 %>
                            等价于 out.print("内容");
                    3. <%! java代码  %>
                        a. servlet的成员位置(类中方法外)
                        b. 适合用来定义方法和成员变量

                --%>
            <h5>标题</h5>
            <%
                System.out.println("xx");
                out.print("out: 网页上输出");
//                PrintWriter writer = response.getWriter();
//                writer.print("writer:网页后写先输出");
                method01();

            %>
            <%="网页上输出2"%>
            <%!
                int i = 2;
                public void method01()
                {
                    System.out.println("yy");
                }
            %>

        </div>
</body>
</html>

1.4.2 注释

1. html注释
		<!-- 注释静态资源 -->
	
2. JSP注释
		<%-- 注释所有 --%>

3. java注释(JSP脚本内使用)
		// 单行
		/* 多行 */
		/**文档 */
		
#备注: 因为html注释在页面源码中可见, 所以在jsp中推荐使用JSP注释或java注释	

1.5 三大指令

* 作用
		JSP指令用来设置整个JSP页面相关的属性	
* 格式
		<%@ 指令名称 属性名1="属性值1" 属性名2="属性值2" ...%>
		
* 三大指令
	1. page:配置JSP页面
	
	2. include:页面包含(静态)
	
	3. taglib:导入资源文件

1.5.1 page指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
	1). contentType 等价于 response.setContentType(); 设置响应体的MIME类型和编码方式
	2). language    目前仅支持java语言
	3). import      导入jar包
		<%@ page import="java.util.Date" %>
	4). errorPage   当前页面报错后,跳转指定错误提示页面
	5). isErrorPage 声明当前jsp页面是一个异常处理页面,打开异常开关
		false(默认)
		true:可以操作exception异常对象
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="500.jsp" %>
<html>
<head>
    <title>demo2</title>
</head>
<body>
<h3>page指令</h3>
<%
    new Date();
    new SimpleDateFormat();
    Integer age = 1 / 0;
%>
</body>
</html>

500.jsp(异常处理页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>500</title>
</head>
<body>
<h4>服务器繁忙,请稍后重试....</h4>
<%
    // 获取错误信息,发送程序员,进行处理。。。
    out.print(exception.getMessage());
%>
</body>
</html>

1.5.2 include指令(静态包含)

1. 作用: 在一个jsp页面包含其他的页面
2. 目的: 避免代码冗余
3. 举例:
		a. 有A.jsp和B.jsp两个页面, 头部都一样, 那么两个页面得写相同的代码两遍, 很冗余
        b. 把头部抽取出来 top.jsp , 分别A.jsp和B.jsp包含即可, 这样避免了代码冗余
        
4. 语法:  
	<%@include file="top.jsp"%>        

在这里插入图片描述
top.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>top.jsp</title>
</head>
<body>
<div style="border: skyblue dashed 5px;height: 100px">头部</div>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo3</title>
</head>
<body>
<%@include file="top.jsp"%>
<div style="border: red solid 5px;height: 400px">我是include静态包含,主体..</div>
</body>
</html>

1.5.3 taglib指令

之后我们会讲解apache提供的jstl标准标签库(手动导入)
在这里插入图片描述

② 通过taglib指令引入在这里插入图片描述

1.6 九大内置对象

* 作用
		在JSP页面中不需要获取和创建,可以直接使用的对象
		
* JSP一共有9个内置对象
	变量名				  真实类型					作用
	pageContext		    PageContext			 	 当前页面中共享数据(域对象)
    request				HttpServletRequest       一次请求中共享数据(域对象)
    session             HttpSession				 一次会话中共享数据(域对象)
    application			ServletContext			 整个web应用共享数据(域对象)
    -----------------------------------------------
    response			HttpServletResponse		 响应对象
    page(this)				Object			    当前页面(servlet)对象
    out                 JSPWriter				 输出对象
    config              ServletConfig			 servlet配置对象
    exception           Throwable				 异常对象(默认关闭...)		

* 常用
	1. pageContext
			1)当前页面的域对象
			2)获取其他八个内置对象		
	2. request
			1)接收用户请求(参数)
			2)一次请求中域对象
			
	3. response
			1)设置响应
				字节流
				字符流
	4. out
			1)专门在jsp中处理字符输出流
				print(); // 在网页中输出内容

1.7 JSP三个动作标签

* 作用
		简化JSP页面编码
* 常用
	<jsp:include>:页面包含(动态)
		相当于
			request.getRequestDispatcher().include(request,response);
	<jsp:forward>:请求转发(页面跳转)
		相当于
			request.getRequestDispatcher().forword(request,response);
	<jsp:param>:参数传递
		这是是forward的子标签
		使用request.getParameter() 获取参数

1.7.1 动态包含

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo6</title>
</head>
<body>
<jsp:include page="top.jsp"></jsp:include>
<div style="border: green solid 5px;height: 400px">jsp的动态包含,主体</div>
</body>
</html>

静态包含和动态包含区别
在企业开发时,我们推荐使用静态包含,提升访问性能;注意:不能出现重名的变量。。。

在这里插入图片描述

1.7.2 请求转发

a.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a</title>
</head>
<body>
<%
    System.out.println("a.jsp执行了");
    request.setAttribute("username", "request域存值了");
%>
<jsp:forward page="b.jsp">
    <jsp:param name="name" value="jack"></jsp:param>
    <jsp:param name="age" value="18"></jsp:param>
</jsp:forward>
</body>
</html>

b.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b</title>
</head>
<body>
<%
    System.out.println("b.jsp执行了");

    // request域传递
    System.out.println(request.getAttribute("username"));

    // param标签传递
    System.out.println(request.getParameter("name"));
    System.out.println(request.getParameter("age"));
%>
</body>
</html>

二 MVC模式【思想】

早期只有servlet,只能使用response输出html标签,非常麻烦。
在这里插入图片描述
后来有了JSP(html+java),简化了servlet开发;如果过度使用JSP,在JSP页面中写了大量的java代码和html标签,阅读性很差, 造成难于维护,难于分工协作的场景。
在这里插入图片描述
再后来为了弥补过度使用jsp的问题,我们使用servlet+jsp这套组合拳,利于分工协作。
在这里插入图片描述

2.2 MVC介绍

MVC设计模式: Model-View-Controller简写。

MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑显示界面的设计方法。

简单来说:前辈们总结的一套设计经验,适合在各种软件开发领域,目的:高内聚,低耦合

* M:model(模型) JavaBean(1.处理业务逻辑、2.封装实体)

* V:view(视图)  Jsp(展示数据)

* C:controller(控制器)Servlet(1.接收请求、2.调用模型、3.转发视图)

* 优缺点
	优点
		降低耦合性,方便维护和拓展,利于分工协作
	缺点
		使得项目架构变得复杂,对开发人员要求高

在这里插入图片描述

三 编译

# java编译语言
	.java 源码  -> .class(字节码文件)	-> runtime(运行)
	
1. 编译器: jdk提供的
	1). 按照特定的语法规则, 将java源码 转成换 字节码(二进制)
    2). 在编译过程检查语法是否错误, 如果有错误会报错: 编译错误
	3). jvm只能识别字节码, 运行字节码
	4). 编译不知道运行时发生的事情(编译在运行之前)

2. 不使用开发工具: 手动调用编译器
	1). javac (compile)命令 编译  (javac.exe)
	2). java 命令 运行 (java.exe)
3. 使用了idea(开发工具IDE: eclipse/idea)
	0). 作用: 提升开发效率
	1). 点击run: 自动编译 + 运行
		输出在out目录下
	2). idea举例: 将整个工程先编译一遍,如有编译错误,就报错

4. 编译看左边, 运行看右边

5. javaweb工程
	0). idea开发工具, tomcat软件, javaee工程
	1). javaee工程中新增一个类(.java) : 编译由idea启动tomcat的时候做的
		a. 如果我们不重新启动tomcat, 这个新类没有编译,无法运行(restart)
	2). javaee工程中修改一个已有的类, 只要重新部署即可
    	a. 因为这个类的字节码文件产生
    	b. 需要重新编译刷新, 但是因为字节码已存在,tomcat知道它的位置,重新读取即可
    3). 新增JSP, 由tomcat的JspServlet的service方法编译的(浏览器访问一次就执行一次)
    	a. 新增或修改JSP
    	b. 浏览器重新访问一下
    	c. 再去看生成的Servlet源码
    4). 静态资源: html /css /js / 资源文件 , 无需编译,直接重新部署即可	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值