JSP基础
来源:互联网 发布:java 数据库连接池 编辑:程序博客网 时间:2024/06/07 04:51
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>
运行结果:
- jsp基础
- jsp 基础
- JSP基础
- JSP基础
- JSP基础
- Jsp基础
- JSP基础!
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- jsp基础
- JSP基础
- logback配置
- Java基础:Java基本数据类型
- 贝塞尔曲线扫盲
- IntelliJ IDEA部署java web项目记录
- Android视图绑定框架之ButterKnife
- JSP基础
- 并茶集 1232 hdu
- 获取句子迷的经典语录[Python版本]
- 浅析MongoDB数据库的海量数据存储应用
- mysql 清空表数据,并且主键回到1
- Bootstrap canvas自适应
- 如何简单地实现引用类型的深度克隆
- poj2229【完全背包-规律Orz...】
- 用ajax异步上传附件