JSP--Java server Pages
本身就是一个servlet
直接在HTML中内嵌Java代码
JSP程序由Servlet Engine先将其转换成Servlet代码,接着将它编译成类文件载入执行
只有当客户端第一次请求JSP时,才需要将其转换和编译
request.getAtrribute("name") 和 request.getParameter(“name”)的区别:
request/response/session/application理解为
一个存放name-value对的容器
request.getAtrribute("name")(
Objec
t类型)(
保存的是name-value对
)
request.getParameter(“name”)(
String
类型)(
接收传递的参数
)
JSP传统语法:
(servlet只有一个实例,init()初始方法只有在第一次接收请求时执行一次)
Declaration:声明
<%!
int count=0; (成员变量)
void m(){} (声明成员方法可行)
%>
任意的<%! %>中的代码在最外层类块内
Scriptlet:小程序段
<%
int count=0;(局部变量)
oid m(){} (不可行,<%%>本身就是一个成员方法,不能在方法里面声明方法)
%>
Expression:表达式
<%= count %> (输出变量count的值到浏览器)
=后面必须是字符串变量或者是可以被转换成字符串的表达式
不需要;结束
任意的<%= %>和<% %>中的代码在同一个方法_jspService内
Comment:注释
<!-- html注释 --> (浏览器可以看见)
<%-- jsp注释1 --%> (浏览器不能看见,目的给程序员自己看的)
<%
// jsp注释2(浏览器不能看见)
/*
jsp注释3(浏览器不能看见)
*/
%>
Directives:
(编译指令)
在编译期间的指令 程序还未开始运行
指明与JSP Container的沟通方式,编译期间指明这个页面的特定
<%@ page
language="java"
import="java.util.Data"
errorPage="a.jsp" //出错以后会在显示的页面内容(出错后显示a.jsp页面)
isErrorPage="true|false" //当期页面是不是一个显示出错的页面
contentType="text/html;charset=gb2312" //当前页面的内容类型
%>
<%@include file="fileURL" %>
首先
把另外一个文件的内容
原封不动
的放进来然后在继续
编译整个文件
限制:
不能向fileUR中传递参数
不能abc.jsp?user=aaa
Action:(
动作指令
)
在运行期间的指令--没有百分号|%
<jsp:useBean>
可以在JSP中使用已经定义好的Bean
Bean的基本要素:(Bean不要使用裸体类,应放到package里)
必须有一个不带参数的构造器。在JSP元素创建Bean时会调用空构造器
Bean类没有任何的公共实例变量(成员变量的访问修饰符是private)。变量名首字母小写
设置(public)的getter/setter来读/写成员变量的值
格式:
<jsp:useBean
id="beanName" //(对象实例)
class="package BeanClass" //(Bean类名称)
type="typeNmae" //可以是父类或本类一般用法(父类引用指向子类对象)type="java.lang.Object"
scope="page|request|session|application" //(作用范围)
/>
<jsp:useBean id="cb" calss="bean.CounterBean"/>
相当于
<%@page import="bean.CounterBean"%>
<% CounterBean cb= new CounterBean(); %>
<jsp:>
<jsp:setProperty>
<jsp:getProperty>
<jsp:useBean id="cb" calss="bean.CounterBean">
<jsp:setProperty name="cb" property="count"
value="<%=request.getParameter("proName")%>"
/>
<jsp:setProperty name="cb" property="count"
param="proName
"/> (类型自动转换)
<%-- <%cb.setCount(23);%> --%>
通过*号来设置所有属性名称与form表单传递的参数的名称相同的属性值
<jsp:setProperty name="hello" property="*" />
<jsp:getProperty name="cb" property="count"/>
<%-- <%= cb.getCount()%> --%>
<jsp:useBean />
request.setCharacterEncoding("GBK");
requset传递参数过来,先把request里面的参数转换成GBK格式
提交---设置提交的值
检查乱码:在提交值和设置值之前
打印出检测的值
转码:(前提是知道原先的编码)
String name = request.getParameter("name");
<%= new String(name.getBytes("IS08859-1"), "GBK")%>
<jsp:include>
用于动态包含JSP或HTML文件等
除非这个指令会被执行到,否则它是不会被Tomcat等JSP Engine编译
格式:(可以传递参数)
<jsp:include page="URLSperc" flush="true"/>
<jsp:include page="URLSperc">
<jsp:param name="paramName" value="ParamValue"/> //参数传值
</jsp:include>
和编译指令<%@include file="URL"%>的区别:
<jsp:include page="url">是运行期间被执行了才会被动态编译包含;能传递参数
<%@include file="url"%>是编译期间就被编译包含;不能传递参数
<jsp:forward>(页面跳转)
用于将一个JSP的内容送到page所指定的JSP程序或者Servlet中处理(URL)
格式:
<jsp:forward page="URL" flash="true"/>
<jsp:forward page="URL">
<jsp:param name="paramName" value="paramValue"/>
</jsp:forward>
<jsp:forward page="url">和response.sendRedirect("“url”)的区别:
<jsp:forward page="url">使用同一个request(只有一次请求)
response.sendRedirect("url")是两个不同的request(有两次不同的请求)
response.sendRedirect("URL");(页面重定向跳转)
内置对象 :(9个)
JSP常用的内置对象已经常用方法(不带横线的就是)
out:println(); write() newLine();(输出一个换行符)
request:getParameter("name");getParameterNames(); getParameterValues();
response:addCookie(); addHeader();sendError(int 404);(错误码)sendRedirect();setContentType(“text/html;charset=utf-8”);
pageContext:(页面的运行环境)编译之后放到某个地方去运行,那个地方就是pageContext
session:setAttribute(Stirng name, Object value); (Object类型) getAttribute(String name); boolean isNew();
application:对应的方法是--ServletContext setAttribute(Stirng name, Object value); (Object类型) getAttribute(String name); boolean isNew();
config:web.xml文件
exception:
page:当前页面
Servlet和JSP的通信:
从JSP调用Servlet:
<jsp:forward page="url">
response.sendRedirect("url");
从Servlet调用JSP:(HttpServlet) this.getServletConfig().getServletContext().getRequestDispatcher("url").forward|include(req, resp);
response.sendRedirect("url");
JSTL
EL
taglib