JSP学习笔记汇总(待整理)

总结

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的参数必须和属性类型一样。==============================================

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值