1.jsp是什么
2.jsp=html+java代码
这之后学的就是怎么样可以在jsp中不要写Java代码
3. 服务器是如何调用并执行一个jsp页面
4.服务器如何把Jsp页面中的html排版标签发送到客户端
都是在service()方法中:
5.Jsp页面中的java代码服务器是如何执行
<span style="font-size:18px;">out.write(new Date().toLocalString());</span>
6.Web服务器在调用jsp时,会给jsp提供一些什么java对象
7.Jsp的最佳实践
Jsp用来做页面
Servlet用来做业务逻辑
改变页面的编码(设置页面的编码)
Window—Preferences—搜索jsp—
Encoding:ISO 10646/Unicode(UTF-8)
如果只在工程右击改的话,那么改的只是这个工程的
Jsp页面默认改为代码界面:
Open WIth--MyEcliipse JSP Editor:Window—Preferences—
搜索:File AssociationsFile types:*.jsp
Associated editors:
MyEclipse JSP Editor....
点击Default
8.jsp的模板元素
JSP页面中的HTML内容称之为JSP模版元素
Html代码的发送:在service方法里面调用out.write()将模版代码发送到客户端。
8.1 JSP脚本
写在<% %>里面的称为JSP脚本:java代码里面的语句结束要有分号。
8.2 脚本表达式
语法:<%=变量或表达式 %>
举例:当前时间:<%= new java.util.Date() %>
<body>
<%
request.setAttribute("name","张无忌");
%>
脚本表达式(输出一个变量):<%=request.getAttribute("name")%>
运行结果:
脚本表达式(输出一个变量:张无忌)
8.3JSP脚本片段
<%
多行java代码
%>
举例:
<%
intx = 10;
out.println(x);
%>
<p>这是JSP页面文本</p>
<%
inty = 20;
out.println(y);
%>
输出一个表格:for循环的是jsp脚本:
<table border=1 width=200>
<%
for(int i=1;i<=5;i++){
out.write("<tr><td>");
out.write(i+"");
out.write("</td><td>");
out.write("aaa");
out.write("</td></tr>");
}
%>
</table>
此种做法显然太麻烦,
换成如下写法:for循环的是html代码
<table border=1 width=200>
<%
for(int i=1;i<=5;i++){
%>
<tr>
<td><%=i+"" %></td>
<td><%="aa" %></td>
</tr>
<%
}
%>
</table>
运行结果:
9.输出表达式
即输出到页面的东西
<%=name %>
out.print(name);
输出表达式后面不能加分号
10. Jsp的声明:
格式:<% ! %>
作用: 可以定义类变量和类方法,实例变量和实例方法.
<%!
public void demo(){
System.out.println("大家好");
}
String name="令狐冲";
public static void demo1(){
System.out.println("我是静态的方法");
}
public class A{}
%>
<%
demo();
demo1();
out.write(name);
%>
成为了内部类
<% %>在service()方法里面。
11.注释:
HTML注释:<!-- -->,页面源码能看到
Java注释: // /* */页面源码看不到
Jsp注释: <%-- --%> 页面源码看不到 ctrl+shift+/
去掉:alt+shift+\
12.指令标签
12.1 page
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
用来说明页面的信息
Import:唯一一个可以写多个的属性。导入后,就可以在页面引用该后台的代码了
其他属性:
autoFlush=”true”:自动刷新,缓存区满了,自动由服务端向客户端发送信息。
buffer=”8k”:缓冲区
info:相当于键值对,
errorPage:当页面出现了异常:自动去哪一个页面
isErrorPage:把要去的那个页面表示成确实是一个错误页面
此种配置只适用于500的异常
<error-page>
<error-code>404</error-code>
<location>/8.jsp</location>
</error-page>
本身有错误的那个页面要设置page指令:errorPage=“7.jsp”
表明出现错误时要到达该页面。
当出现错误时要到的那个页面的page指令里必须写上isErrorPage=“true”
表明此页面就是来处理异常的页面。
可以通过异常对象拿到堆栈里的信息。
<body>
服务器正忙,请一会再来访问
<%
String reason=exception.getMessage();
out.write(reason);
%>
</body>
Page指令解决JSP中文乱码:
输出响应正文时出现的中文乱码问题:Response.setContentType();
读取浏览器传递的参数信息时出现的中文乱码问题:
Post方式:Request.setCharacterEncoding();
Get方式:new或修改服务器
JSP引擎将JSP源文件翻译成的Servlet源文件默认采用ISO8859-1编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。
指定:pageEncoding
12.2 include
<%@include file=”” %> : 静态包含 (是指的代码的拷贝) (推荐)
指代码级别的包含,将目标页面的源码拷贝一份包含进来。
<jsp:include page=“” > : 动态包含 (是指的将目标页面的执行结果的包含)
指执行目标页面,将结果包含进来。<%@include file=“被包含组件的绝对URL或相对URL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
12.3 taglib
标签库指令:导入标签库时用。
13.动作标签
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
13.1 <jsp:forward>标签:请求转发
13.2 <jsp:param>标签
<jsp:includepage="relativeURL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
<jsp:forwardpage="relativeURL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
14: 九大内置对象(可以直接拿来用,不需要创建)
request:请求对象
response:响应对象
config:Servlet的一个配置对象
application:全局对象 每个应用只有一个
exception:异常对象 通常不处理该异常,将jsp编译成一个Servlet的时候,执行service方法,已经帮我们抛了异常,所以没必要再去做异常处理了
Session:会话对象
page:将JSP页面编译成一个Servlet类的时候,该类的一个实例对象
out:输出流对象
pageContext:
out:
<body>
<%
out.write("abc") ;
response.getWriter().write("def") ;
%>
</body>
运行结果:def abc
Flush():清空缓存区,把缓存里的数据直接输出到页面:
<body>
<%
out.write("abc") ;
out.flush() ;
response.getWriter().write("def") ;
%>
</body>
运行结果:abcdef
当在page指令出设置:表示没有缓冲: buffer="0kb"
通常不会这样设,因为缓存可以提高效率
此效果和flush一样 flush:清空缓冲
<%
out.println("aaa");
response.getWriter().write("bbb");
%>
PageContext:
代表的是一个页面的上下文对象
a: pageContext 是一个域对象 : 范围就是本页面
本身是一个域对象,存的数据只能当前页面来访问。void removeAttribute() ;
<body>
<!-- pageContext对象的第一个作用: 1. 作为域对象
a.存储数据
-->
<%
pageContext.setAttribute("name", "张无忌") ;
pageContext.setAttribute("name1", "张三丰",PageContext.SESSION_SCOPE) ;
%>
<%
String name = (String) pageContext.getAttribute("name") ;
out.write(name) ;
String name1 = (String) session.getAttribute("name1") ;
out.write(name1) ;
%>
</body>
特点:放的数据,只能当前页面中来用
void setAttribute(String key,Object value,int scope)
void removeAttribute(String key,int scope)
Object getAttribute(String key,int scope)
Scope:
PageContext.PAGE_SCOPE //本页面范围
PageContext.REQUEST_SCOPE //请求范围
PageContext.SESSION_SCOPE //会话范围
PageContext.APPLICATION_SCOPE //全局范围
3.提供了查找数据的方法:
从四大域范围中查找数据
查找是依次从PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE
四个范围去寻找,找到为止,找不到返回null)
Object obj = pageContext.findAttribute(String key)
Obejct findAttribute(key) ;
从四个域对象里分别寻找数据
<body>
pageContext对象从4个范围中寻找数据:
<%
// pageContext.setAttribute("name", "张三丰") ;
// request.setAttribute("name", "张无忌") ;
// session.setAttribute("name", "张翠山") ;
application.setAttribute("name", "张果老") ;
%>
<%
String name = (String) pageContext.findAttribute("name") ;
out.write(name) ;
%>
</body>
当寻找的属性不存在时,空指针异常
b: 提供了获取其他8大对象的方法
request.setAttribute("name", "ÕÅÈý") ;
pageContext.getRequest().setAttribute("name", "ÕÅÈý") ;
以上两句没有任何区别
<body>
pageContext对象的第二个作用: 获取其他8个对象
两种写法没有任何差别
<%
//底层用 页面不需要这样写
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest() ;
req.setAttribute("name", "东方不败") ;
request.setAttribute("name", "张三丰") ;
%>
<%
String name = (String) pageContext.findAttribute("name") ;
out.write(name) ;
%>
</body>
c: 提供了转发和包含的简易方法
<body>
pageContext对象的第三个作用: 请求转发和请求包含
<%
request.setAttribute("name", "东方不败") ;
//请求转发 不用拿取请求转发器了 :
//pageContext.forward("/7.jsp") ;
//请求包含:
pageContext.include("/7.jsp") ;
%>
</body>
d:有几个jsp提供的标签,动态标签只是标签,并不是java代码
15.Out对象的输出问题
16、四大域对象(相当重要)
PageContext:页面范围的数据。用的很少
ServletRequest:请求范围的数据。用的很多。显示一次数据后就没有用了,这样的数据应该放到该范围中
HttpSession:会话范围的数据。用的很多。每次请求和响应都需要共享的数据。比如登录信息,购物信息。
ServletContext:应用范围的数据。用的不多。所有客户端都共享的信息。注意同步。
数据能不能取到,关键是不是从一个地方取的数据
17、JavaBean的概念(相当重要)
1、什么是JavaBean(VO:Value Object;DO:Data Object;POJO:最简单的java对象,DTO Data Transfer Object)
遵循一定的命名规则:
必须有默认的构造方法
类的声明为public类型
字段都是私有的 private boolean married;
提供公有的getter或setter方法(属性)。getMarried=isMarried setMarried
一般实现java.io.Serializable接口(序列化接口)
2、实际开发中有什么用?
封装数据,便于传递数据。
在jsp中操作javabean
使用动作元素(内置标签)
jsp:useBean:用于从指定范围根据名称查找JavaBean,如果没有找到,创建该JavaBean的实例,然后放到指定的范围中。如果找到了,直接取出来用。
属性:
id:查找的bean的名称。
class:查找的bean的类全名(包名.类名)
scope:指定查找的范围
默认值page,从PageContext页面范围找
可选值:
request,从ServletRequest中找,请求范围
session,从HttpSession中找,会话范围
application,从ServletContext中找,应用范围
jsp:setProperty:给指定名称的bean的属性设置值。调用setter方法
属性:
property:对应的是JavaBean中的setter方法
name:指定那个bean
value:设置的值
param:请求参数的名称
jsp:getProperty:把指定名称的bean的属性的值打印到页面上
如果一个属性的值为null,界面就会显示null,不爽
属性:
property:对应的是JavaBean中的setter方法
name:指定那个bean
<body>
<!-- userbean标签相当于 User user = new User() ;-->
<jsp:useBean id="user" class="com.heima.bean.User" ></jsp:useBean>
<jsp:setProperty property="name" name="user" value="张无忌"/>
<jsp:getProperty property="name" name="user"/>
</body>
User.java:
package com.heima.bean;
import java.io.Serializable;
public class User implements Serializable{
private String name ;
private String age ;
private String sex ;
private String address ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
<body>
封装表单用的
<form action= "/day12_00_jsp/12.jsp" method="post">
姓名:<input type = "text" name = "name"><br>
年龄: <input type = "text" name = "age"><br>
性别:<input type = "radio" name = "sex" value = "男">
男<input type = "radio" name = "sex" value = "女">女<br>
地址:<input type = "text" name = "address">
<input type = "submit" value = "提交">
</form>
封装超链用的
<a href = "/day12_00_jsp/12.jsp?name=abc&age=30">封装数据</a>
封装转发标签的数据用的
<jsp:forward page="/12.jsp?name=abc">请求转发 服务端跳转 不用加工程名
<jsp:param value="15" name="age"/>
<jsp:param value="beijing" name="address"/>
</jsp:forward>
</body>
12.jsp:
<body>
用user对象封装数据:
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="user" class="com.heima.bean.User"></jsp:useBean>
param对应表单控件的名字
把页面上名字叫name的控件(param="name")里面的内容封装到user对象(name="user")的name属性(property="name")中
<jsp:setProperty property="name" name="user" param="name"/>
<jsp:setProperty property="age" name="user" param="age"/>
<jsp:setProperty property="sex" name="user" param="sex"/>
<jsp:setProperty property="address" name="user" param="address"/>
<jsp:getProperty property="name" name="user"/>:
<jsp:getProperty property="age" name="user"/>:
<jsp:getProperty property="sex" name="user"/>:
<jsp:getProperty property="address" name="user"/><br>
<hr>
采用内省机制进行封装:<br> 由服务器帮我们找param,不用我们指定
要求页面上的控件的名字和javabean里面的名字一一对应
<jsp:setProperty property="*" name="user"/>
<jsp:getProperty property="name" name="user"/>:
<jsp:getProperty property="age" name="user"/>:
<jsp:getProperty property="sex" name="user"/>:
<jsp:getProperty property="address" name="user"/><br>
<hr>
封装超链的数据:<br>
<jsp:useBean id="user1" class="com.heima.bean.User" ></jsp:useBean>
<jsp:setProperty property="*" name="user1"/>
<jsp:getProperty property="name" name="user1"/>
<jsp:getProperty property="age" name="user1"/>
<hr>
封装转发标签的数据:<br>
<jsp:useBean id="user2" class="com.heima.bean.User" scope="session"></jsp:useBean>
<jsp:setProperty property="*" name="user2"/>
<jsp:getProperty property="name" name="user2"/>
<jsp:getProperty property="age" name="user2"/>
<jsp:getProperty property="address" name="user2"/>
<a href = "/day12_00_jsp/13.jsp">13.jsp</a>
</body>
运行结果: