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 / 资源文件 , 无需编译,直接重新部署即可