通过学习how2j上的知识记的笔记
JSP
通过Servlet进行整个网站的开发是可以的,不过在servlet中输出html代码,特别是复杂的html代码,会很繁琐。
如果能够直接使用html代码,并在html中写java代码就好了,JSP就可以实现这个功能。
一、Hello JSP
1、新建jsp文件
新建一个动态javaweb项目,命名为JSP,导入servlet-api.jar,然后在web-INF下新建一个NewFile.jsp,写进以下代码
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
你好 JSP<br>
<%=new Date().toLocaleString() %>
</body>
</html>
然后运行这个动态项目,输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到以下界面
![0e7f44cd0654e69699c76fe3018fe10a.png](https://img-blog.csdnimg.cn/img_convert/0e7f44cd0654e69699c76fe3018fe10a.png)
2、代码解释
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
<%@page是JSP的指令
contentType="text/html;charset=UTF-8"就相当于response.setContentType("text/html;charset=UTF-8");也就是通知浏览器以UTF-8进行中文解码。
pageEncoding="UTF-8"是jsp的参数,表示如果jsp文件中出现了中文,那这些中文使用UTF-8进行编码。
import="java.util.*"表示jsp文件中调用的java代码需要依赖哪些包,如果需要多个包,中间要用逗号隔开。
<%=new Date().toLocaleString()%>输入当前时间,相当于在servlet中使用response.getWriter().println(new Date().toLocalString());
二、JSP页面元素
1、静态内容,也就是html、css、JavaScript等内容
2、指令<%@ %>,中间是内容,比如<%@page import="java.util.*"%>
3、表达式<%= %>,用于输出一段html
4、<% %>,中间可以写任何java代码
5、声明<%! %>,用来声明任何字段和方法,但不建议这么做。
6、动作<jsp:include page="Filename">,在jsp页面中包含另一个页面
7、注释<%-- --%>
8、<% %>和<%= %>间的关系
比如同样是在网页上输出hell jsp,两种方法的实现不同
<%out.println("hello jsp");%> <%="hello jsp"%>
9、for循环等一些语法练习
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
System.out.println(word);
}
%>
<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
<td>
<%=word %>
</td>
</tr>
<%} %>
</table>
</body>
</html>
![41d290ea7028cef43a9bed222a16adc3.png](https://img-blog.csdnimg.cn/img_convert/41d290ea7028cef43a9bed222a16adc3.png)
三、jsp include
每个网页下面都有版权声明等信息,而且还很长,比如【Copyright © 2019 w3cschool.cn All Rights Reserved. 】,如果有一万个网页,都是使用的这个版权声明,那么在写每个网页的时候,都需要加上这句版权声明,一旦后续版权声明需要更改,一万个网页都挨个需要更改,维护成本很高。
但是,如果把版权声明弄成一个jsp,直接在网页中include这个jsp,那个只需要更改一次版权声明的jsp其他一万个网页中的内容就全部更改了。
1、建立版权声明的jsp 在动态web项目JSP的WebContent下新建footer.jsp,且写入版权声明代码
<hr>
<p style="text-align:center">copyright@2016
</p>
2、在NewFile.jsp中包含footer.jsp
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
System.out.println(word);
}
%>
<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
<td>
<%=word %>
</td>
</tr>
<%} %>
</table>
<%@include file="footer.jsp" %>
<jsp:include page="footer.jsp"/>
</body>
</html>
运行项目输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到如下图
![9d46698b606bbead8f1a59e109a32902.png](https://img-blog.csdnimg.cn/img_convert/9d46698b606bbead8f1a59e109a32902.png)
在程序中可以看到,include有两种方式,分别是指令方式和动作方式
<%@include file="footer.jsp" %> <jsp:include page="footer.jsp"/>
3、指令方式和动作方式区别
jsp执行过程中会转换成*_jsp.java文件
指令方式会把footer.jsp的内容插入到NewFile.jsp中,最后只形成一个NewFile_jsp.java文件
动作方式会形成两个单独的.java文件NewFile_jsp.java和footer_jsp.java,NewFile_jsp.java会在服务器端访问footer_jsp.java,然后把返回的结果嵌入到响应中
4、传参问题
指令方式不存在传参问题,因为最后合并为了一个文件
但是动作方式存在一个访问的步骤,就涉及到了传参问题,
在NewFile的代码中修改一下
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add(&