总结
JSP介绍
JSP是一个基于文本的文档,能够向客户端浏览器返回静态和动态的内容。
静态内容:
HTML,XML,TEXT
动态内容(在服务器端JVM生成):
JAVA代码,JAVABEANS属性,自定义标签
=================================================================
在TOMCAT下CONF文件夹下的web.xml配置初始参数listings为faluse,可以使得用户无法查看网站的资源列表。
在TOMCAT下CONF文件夹下的server.xml里Connector节的port可以修改端口,初始为8080
jsp文件结果TOMCAT编译,会在work->Catalina->localhost->项目名->org->apache->jsp里面找到对应的JSP所生成的JAVA和CLASS文件。
所以内置对象的名字肯定会固定下来,否则就找不到,内置对象比如有application,request等。这些都可以再生成的JAVA里找到。
=================================================================
JSP表达式<%= %>
基本语法
JSP脚本部分
JSP另两类:
指令,动作。
JSP注释为:
<%--
<%代码%>
--%>
在JSP中使用可复用组件,提高JSP可读性。
javabean的创建
userBean,setProperty,getProperty
=================================================================
具体细节:
JSP概述
JSP框架
在JSP中编程可以看成是对Servlet的编程,编写JSP必须在脑子里想象出来对应的Servlet来。
接口JspPage
方法
jspInit
jspDestory
接口HttpJspPage
方法
_jspService
==================================================================
public class HttpJspBase implements HttpJspPage
{
private ServletConfig config;
public final void init(ServletConfig config) throws ServletException
{
jspInit();
}
public void jspInit()
{
}
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException
{
_jspService((HttpServletRequest)request,(HttpServletResponse)response);
}
public _jspService(HttpServletRequest request,HttpServletResponse response)
{}
public final void destroy()
{
jspDestroy();
}
public void jspDestroy()
{}
public ServletConfig getServletConfig()
{}
public String getServletInfo()
{}
}
由此可知:
我们能够覆盖的方法有:
public void jspInit()
{}
public _jspService(HttpServletRequest request,HttpServletResponse response)
{}
public void jspDestroy()
{}
public ServletConfig getServletConfig()
{}
public String getServletInfo()
{}
而从父类Servlet继承的方法因为有final,所以无法覆盖。
==================================================================
某JSP自动生成的JAVA如下:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
public String getServletInfo()
{
return "my jsp";
}
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
//上述变量都可以在JSP中使用。
try {
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('/r');
out.write('/n');
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.write("/r/n");
out.write("/r/n");
out.write("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">/r/n");
out.write("<html>/r/n");
out.write(" <head>/r/n");
out.write(" <base href=/"");
out.print(basePath);
out.write("/">/r/n");
out.write(" /r/n");
out.write(" <title>My JSP 'index.jsp' starting page</title>/r/n");
out.write("/t<meta http-equiv=/"pragma/" content=/"no-cache/">/r/n");
out.write("/t<meta http-equiv=/"cache-control/" content=/"no-cache/">/r/n");
out.write("/t<meta http-equiv=/"expires/" content=/"0/"> /r/n");
out.write("/t<meta http-equiv=/"keywords/" content=/"keyword1,keyword2,keyword3/">/r/n");
out.write("/t<meta http-equiv=/"description/" content=/"This is my page/">/r/n");
out.write("/t<!--/r/n");
out.write("/t<link rel=/"stylesheet/" type=/"text/css/" href=/"styles.css/">/r/n");
out.write("/t-->/r/n");
out.write(" </head>/r/n");
out.write(" /r/n");
out.write(" <body>/r/n");
out.write("/r/n");
out.write(" This is my JSP page. <br>/r/n");
out.println(this instanceof Servlet);
out.println(getServletInfo());
out.write("/r/n");
out.write(" </body>/r/n");
out.write("</html>/r/n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
==================================================================
宏观分类,三大类:
1.scripting 脚本(代码)
{
scripting又分三小类:
a.declaration 声明
b.expression 表达式
c.scriptlet 代码块
}
2.action 动作
3.directive 指令
html高级元素之hidden
在有时,我们需要在form中提交一些不让客户看见的信息,可以用<input type="hidden" name="" value="">来实现,特别是比如控制器的操作选择,operation=add/remove/list等。
Tomcat配置
tomcat改端口
在TOMCAT下CONF文件夹下的server.xml里Connector节的port可以修改端口,初始为8080
配置tomcat来屏蔽用户查看网站的资源列表
在TOMCAT下CONF文件夹下的web.xml配置初始参数listings为faluse,可以使得用户无法查看网站的资源列表。
TOMCAT自动JSP转JAVA
jsp文件结果TOMCAT编译,会在work->Catalina->localhost->项目名->org->apache->jsp里面找到对应的JSP所生成的JAVA和CLASS文件。
所以内置对象的名字肯定会固定下来,否则就找不到,内置对象比如有application,request等。这些都可以再生成的JAVA里找到。
JSP脚本部分
关于JSP脚本
scripting分三类:
a.declaration 声明
<%! %>
b.expression 表达式
<%= %>
c.scriptlet 代码块
<%%>
表达式:
先进行求值,转化成String类型,将其送入输出流,结果通过out.print进行输出。
具体使用方法可以看expression.jsp
代码块:
代码块的内容会原封不动地放在JAVA里。
具体请看scriptlet.jsp
声明:
可以在声明中定义成员变量和方法。
注意,声明中不能用代码块里的变量,如request等。
成员变量的使用必须加同步,原因和servlet一样。
JSP指令部分:
指令会将指令信息发给JSP容器去处理,这样就能影响生成的SERVLET结构。
格式:
<%@directive {attr="value"}*%>
或者
<jsp:directive.name {attr="value"}* />
指令directive可以分成三类:
PAGE页面指令、INCLUDE包含指令、TAGLIB标签库指令。
JSP动作部分
格式
<jsp:名称 属性="" />
动态包含,推荐使用。
<jsp:include page="" />
但注意,和servlet一样,之前不能有任何response操作,不能有OUT输出。
一般不怎么使用,因为FORWARD属于控制层。
<jsp:forward page="" >
<jsp:param name="user" value="admin" /> //可省,该参数可以通过request来获取参数。
</jsp:forward>
PLUGIN允许用户将APPLET引入浏览器中,但用户必须安装了APPLET运行环境,如果用户没的话,用户会进行自动下载,但时间会较长。下面的CODEBASE里填的是项目名。了解即可,一般不用。
<jsp:plugin type="applet" code="myclass.class" codebase="/jsp-app" height="300" width="200">
<jsp:fallback>不支持</jsp:fallback>//填入无法运行的失败内容显示什么。
</jsp:plugin>
========================================================================
*以下为重要部分
scope表示该Bean设置于session还是request还是application里面的Attribute里,除此之外,还有个可填的是page,其作用范围仅限于本页面,默认为page。
id表示Attribute的名字,并且在JSP中可以直接用id调用,而不需要用session.getAttribute(id)等来调用,像下面设置的就可以直接用user这个类对象。
class表是bean的类名。
<%--
1)创建或查找session范围内的一个类型为com.tarena.User的JavaBean对象。
首先调用session.getAttribuet(id的值);
判断返回值是否为null,如果为null,创建一个类型为com.tarena.User的对象。并将该对象以id的值为key保存到session的属性中。
2)声明的一个脚本语言中的临时变量,名字为id的值,值为JavaBean对象
--%>
<jsp:useBean id="user" class="com.tarena.User" scope="session" />
如果将上述class属性变成type。如下:
<jsp:useBean id="user" type="com.tarena.User" scope="session" />
这会导致如果session中的这个id对象不存在,即为null,则他不会想class形式那样自动创建,并报告异常信息(bean ** not found within scope)。如果不为空,则同class形式。
使用type举例如下:
在MVC模式中,V必须先通过C才能显示,所以当用户直接调用V的时候,我们不需要自动为用户创建一些对象BEAN,而应该让其报错,即不准用户绕过C直接访问V。
注意:<jsp:useBean>还有另一种形式,如下
<jsp:useBean id="user" class="com.tarena.User" scope="session" >
<jsp:setProperty name="user" property="*"/>
</jsp:useBean>
这种写法与单独的<jsp:setProperty name="user" property="*"/>有所区别,
这种写法只是在第一次创建的时候才会设置属性,即user为null的时候才设置,如果user存在不为NULL,则不会设置属性了,所以这种形式只有在scope为page和request的时候两种写法无区别,否则自己进行选择。
===============================================================
<jsp:setProperty
<jsp:getProperty
上述两种的用法详见action.jsp
JSP包含的三种方式
1.<%@include file=""%>
2.<jsp:include page="" />
3.<%
application.getRequestDispatcher("").include(request,response);
%>
推荐使用第2中,因为2为动态包含,1为静态包含。
可复用组件
可复用组件就是把一些有用的底层API组装成一个有用的程序单元,以完成更高的任务。
该组件的主要类型有:
JAVABEANS
Enterprise JavaBeans(EJB)
==============================================
JAVABEANS是遵守了某些特定规范(不一定要全)的JAVA类。
*特定规范:
*可序列化serializable
*无参构造器
*属性
*公共的get和set方法属性
*通过事件与其他组件交互
注意,get和set必须和属性类型对应,即get的返回值和set的参数必须和属性类型一样。==============================================