1.第一个JSP程序351.1原理35
在WEB-INF目录之外创建index.jsp文件,然后文件中没有任何内容。
-部署上述项目后,启动服务器,打开浏览器,访问以下地址:
-http://localhost:8080/jsp/index.jsp在大家面前展示的是一个空白。
-事实上,访问以上内容:index.jsp,底层执行如下:index_jsp.java程序class。
-这个index.tomcat翻译将jsp生成index_jsp.java文件,tomcat服务器将index_jsp.生成index_java编译jsp.class文件
-访问index.jsp,实际上,index__jsp.class中的方法。
1.2JSP实际上是Servlet。35-index.jsp访问时,自动翻译生成index_jsp.java,index_会自动编译生成index_jsp.class,那么index_jsp就是一个类。
-index_jsp类继承HttpJspbase,HttpJspbase类继承Httpservlet。所以index_jsp类是servlet类。
-jsp的生命周期与servlet的生命周期完全相同。完全是一件事。没有区别。
-jsp和servlet一样,都是单例。(假单例。)
1.3jsp文件第一次访问比较慢。为什么?35-为什么大多数运维人员在向客户演示项目时提前访问所有jsp文件?
-第一次更麻烦:
-将jsp文件翻译成java源文件
-编译生成class字节码文件的java源文件
-然后通过class创建servlet对象
-然后调用servlet对象的init方法
-最后,调用servlet对象的service方法。
-第二次比较快,为什么?
-因为单例servlet对象的service方法可以第二次直接调用。
2.什么是JSP?-JSP是Java程序。(JSP本质上是Servlet)
-JSP是:JavaServerPages缩写。(基于Java语言的服务器端页面。)
-Servlet是JavaEE的13个子规范之一,因此JSP也是JavaEE的13个子规范之一。
-JSP是一套规范。所有web容器/web服务器都遵循这一规范,按照这一规范进行“翻译”
-每个web容器/web服务器都会内置JSP翻译引擎。
-对JSP进行错误调试时,应直接打开JSP文件对应的java文件,检查java代码。
-JSP开发的最高境界:
-JSP代码出现在我面前,但java代码出现在我的脑海里。
3.既然JSP本质上是Servlet,JSP和Servlet有什么区别?35-职责不同:
-Servlet的职责是什么:收集数据。(Servlet的优势在于逻辑处理、业务处理,然后链接数据库获取/收集数据。)
-JSP的职责是什么:显示数据。(JSP的优势是显示数据)
4.JSP的基本语法354.1直接在JSP文件中编写文字,会自动翻译到哪里?35-将service方法翻译成servlet类的out.write(“翻译到这里”),直接翻译到双引号,用java程序作为普通字符串打印输出到浏览器。
-JSP中编写的HTMLCSJS代码对JSP来说只是一个普通的字符串。但一旦JSP将普通字符串输出到浏览器,浏览器将解释HTMLCSSJS。显示一个效果。
4.2解决响应中的中文乱码问题:35-JSP的page指令(这个指令稍后再详细说明,这里先解决中文乱码问题)
-响应的内容类型是通过page指令设置的,并添加到内容类型的最后:charset=UTF-8
-<%@pagecontentType="text/html;charset=UTF-8"%>,text///html,UTF-8使用的字符集
WEB-INF1代码.jsp<%@page contentType="text/html; charset=UTF-8" %> <%--解决中文乱码问题 35--%><html> <head> <title>my first jsp page</title> <script> function sayHello(){ alert("你好,jsp"); } </script> </head> <body> <input type="button" value="hello jsp" onclick="sayHello()"/> <h1>my first jsp page</h1> abcdefghijklmnopqrstuvwxyz </body></html>
5.Java程序如何在JSP中编写?365.1基本符号365.1.如何在JSP中编写JSP专业注释36- <%--JSP的专业注释不会被翻译成Java源代码。-%>
- <!--本注释属于HTML注释,该注释信息仍将翻译成java源代码,不推荐。-->
5.1.2<%java语句;%>-编写在这个符号中的java程序被视为翻译成Servlet的java程序service方法内部。
-在这里你要小心,你要思考,在这里<%%>在这个符号中写java代码时,你应该永远记住你在“方法体”中写代码
WEB-INF2代码.jsp<%--在jsp中编写java代码 36--%><%@page contentType="text/html; charset=UTF-8" %><% System.out.println("hello,jsp");%><!--不专业的HTML注释仍将被翻译成java源代码。不要在JSP中使用此注释--><%--JSP专业注释不会将注释信息翻译成Java源代码。建议使用这种注释方法。--%><%--错误报告原因:在service方法中定义的变量不能用private等访问权限修改。--%><%-- private int i;--%><%--在方法体中,静态代码块不能直接编写,方法不能直接编写,方法套不允许。--%><%-- static { System.out.println(“静态代码块执行”); }--%><%-- public static void m(){ System.out.println("m method execute"); }--%><% int num = 100;%><% System.out.println("num="+num);%><%--错误原因:方法体中的每一行代码都是java语句,java语句要分号;结尾。--%><%-- System.out.println("hello world")--%>
5.1.3方法体能写什么,不能写什么,你心里明白吗?36-编写在service方法中的代码是有序的,方法体中的代码应按照自上而下的顺序逐一执行。
-不能在service方法中写静态代码块,不能写方法,不能定义成员变量。。
-在同一JSP中<%%>多个符号可以出现这个符号。
5.1.4<%!%>36-编写在这个符号中的java程序将自动翻译到除了service方法。
-这种语法很少使用。为什么?不建议使用,因为在service方法外写静态变量和实例变量时,会出现线程安全问题,因为JSP是servlet,servlet是单例。在多线程并发的环境下,一旦修改了静态变量和实例变量,必然会出现线程安全问题。
WEB-INF3代码.jsp<%--在这个符号<%! %> java程序将自动翻译到service方法之外。 36 --%><%@ page contentType="text/html;charset=UTF-8" %><% System.out.println("hello servlet");%><%--以上这一点在此解释<% %>service方法体中会放置java代码,而下面的<%! %>java代码将被放置在service外,因此在3_jsp.java中,<%! %>java代码将被放置在service外,因此在3_jsp.java中,<%! %>在上而<% %>在下--%><%! ///成员变量 private String name = "jackson"; ///静态代码块 static { System.out.println(“静态代码块执行”); } //方法 public static void m1(){ System.out.println(m1()执行方法); }%>
5.2JSP输出语句36-37-如何在浏览器上输出java变量?
-<%Stringname=“jack”;
out.write("name="+name);
%>
-注:上述代码中的out是JSP的九个内置对象之一。可以直接使用。当然,它只能在service方法中使用。
-如果在输出到浏览器的内容中没有“java代码”,例如,输出的字符串是一个固定的字符串,可以直接在jsp中编写,而无需编写<%%>这里。
-若输出内容中含有“java代码”,此时可采用以下语法格式:
-<%=%>注:将要输出的内容写在=的后面。
-<%=%>这个符号会翻译到哪里?最后翻译成什么?
-将这个java代码翻译成:out.print();
-将其翻译成service方法。
-何时使用<%=%>输出呢?输出内容包含java变量,输出内容是动态内容,而不是死字符串。如果输出是固定字符串,可以直接在JSP文件中编写。
WEB-INF4代码.jsp<%@ page import="javax.crypto.spec.PSource" %><%-- JSP输出语句 36--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><% String name = "jack"; System.out.println(name);///这里输出到控制台 //如何在浏览器上输出java变量? ///可以直接在这个符号中使用out对象 36 out.write("name="+name); //如果将字符串输出到浏览器上。可以直接写在外面 37%><%--写在外面--%><br>asdsg<br><%--若输出内容中含有“java代码”,此时可采用以下语法格式: 37--%><%--- <%= %> 这个符号最终会被翻译成 java代码: out.print(); 将其翻译成service方法。--%><%= 100+200%><%--输出是固定的,纯字符串。--%><%= 100+200%><%--输出是固定的,纯字符串。这样输出毫无意义。--%><%="hello world" %> <%-- out.print("hello world"); --%><br><%--就这样写吧。--%>hello world<br><% int a = 100; int b = 200; int c = a + b;%><%=c %><% String username = "jack";%><%=“成功登录,欢迎" + username %> <%-- 等于out.print(“成功登录,欢迎” + username); --%>
- 直接在JSP中编写普通字符串 将outt翻译到service方法.write(这里”)
- <%%> 将其翻译到service方法体内,内部是java语句。
- <%! %> 除了service方法的翻译。
- <%= %> 将其翻译成service方法体,翻译成:out.print();
- <%@page contentType="text/html;charset=UTF-8"%>
- 通过contenttype属性设置响应内容类型的page指令。
