什么是JSP
JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据
1.jsp的作用
*Servlet:
缺点:不适合设置html响应体,需要大量的response.getWriter().print(“html”)
优点:动态资源,可以编程
*html:
缺点:静态页面,不能包含动态信息
优点:不用为输出html标签而发愁
*jsp:
优点:在原有的html的基础上添加java脚本,构成jsp页面
2.jsp和Servlet的分工:
*JSP:
>作为请求发起页面,例如显示表单、超链接。
>作为请求结束页面,例如显示数据。
*Servlet:
>作为请求中处理数据的环节。
3.jsp的组成
*jsp = html + java脚本 + jsp标签(指令)
*jsp中无需创建即可使用的对象一共有9个,被称为9大内置对象。例如:request,out
*3种java脚本:
><&…&>:java代码片段(常用),用于定义0~N条java语句!不能定义类,不能定义成员方法,不能定义成员变量!
><&=…&>:java表达式,用于输出(常用),用于输出一条表达式(或变量)的结果。
><&!…&>:声明,用来创建类的成员变量和成员方法(用的很少),类体中放什么,这就可以放什么
演示jsp中java脚本的使用:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// http://localhost:8080/my1/
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>MyWeb</title>
</head>
<body>
<h1>This is my page!</h1>
<a href="hello.html">hello</a><!-- hello.html的路径是相对于head中的base,base中的链接相当于写到了a中的href之前 -->
<!-- 但是如果以斜杠开头,则不按这个标准 -->
<br/>
<%
int a = 10;
%>
<%
out.print(a);
%><br/>
<!-- 或者可以使用 -->
<%=a %>
</body>
</html>
效果图:
演示JSP与Servlet的分工
form.jsp如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>加法运算</title>
</head>
<body>
<h1 color="red" align="center">简单计算器</h1>
<form action="/my1/Add" method="post" target="_blank">
整数1:<input type="text" name="value1"><br/>
整数2:<input type="text" name="value2"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
Add的Servlet如下:
public class Add extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//String类型转换成int类型
int value1 = Integer.parseInt(request.getParameter("value1"));
int value2 = Integer.parseInt(request.getParameter("value2"));
//把结果保存到request域中
request.setAttribute("result",value1+value2);
//请求转发到reslut.jsp中
RequestDispatcher rd = request.getRequestDispatcher("reslut.jsp");
rd.forward(request,response);
}
}
reslut.jsp如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result</title>
</head>
<body>
<h1 color="red" align="center">这里可以看到结果</h1>
<table border="1" align="center" width="50%">
<tr>
<th>结果:</th>
<td><%= request.getAttribute("result")%></td>
</tr>
</table>
</body>
</html>
当访问form.jsp的时候
点击提交可以看到结果:
JSP原理
*jsp其实就是一个特殊的Servlet
>当jsp页面第一次被访问时,服务器会把jsp变异成java文件(这个java其实是一个Servlet类)
>然后再把java编译成.class文件
>创建该类对象
>最后调用他的service方法
>第二次请求同一个jsp时,直接调用service方法
*在Tomcat的work目录下可以找到jsp相应的.java源代码
*查看jsp对应的java文件:
>java脚本
>html
JSP注释:
*<%– …. –%>:当服务器把jsp编译成java文件时已经忽略了注释部分!
打开tomcat根目录下的work文件夹,找到jsp对应的.java文件就可以看到Tomcat生成的java,其中java代码原样不动,html的标签都转换成了out.write(),其中还定义了八个对象,也就是在自己写jsp的时候直接使用的九大对象中的八个(其中有一个并不是所有jsp都存在)
看下面一个代码块儿:
abcdefg
//不是脚本,所以会按照字符串输出
//即out.write("abcdefg");
<%
int a = 10;
System.out.println(a);
out.print(a);
%>
//这部分是脚本,Tomcat会添加到java文件中
a
//这个a也不是脚本,所以按照字符串输出
//即out.write("a");
<%=a%>
//这句脚本,即out.print(a);
是脚本的就out.print();
,不是脚本的就out.write("...");
其实这两个方法对于显示来说是没有区别的,但write是将非脚本的代码以字符串的形式打印出来,而脚本中的变量就用print打印出来
总结:
- html数据都会在
out.write()
中出现,而且是在双引号内。即当前字符串输出给客户端! - <%…%>中数据会原封不动的加入到“真身”中,它一定是一条合法的Java语句。
- <%=…%>中的数据会放到
out.println()
中,但没有双引号,那么就不是输出字符串了,而是输出变量。 out.println()
和out.write()
是相同的功能!但是看到jsp代码,要知道每句话具体对应的是哪个
本人是菜鸟一枚,当做学习笔记写博客。谢谢各路大咖驻足审阅