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

来源:互联网 发布:linux apache php7 编辑:程序博客网 时间:2024/04/30 02:24

总结

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

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 唱吧不能凳入怎么办 唱吧密码忘了怎么办 yy违规b类z怎么办 奇云2中控台褪色怎么办 uv打印错一个字怎么办 多肉砍头后的桩怎么办 哥哥太爱我怎么办电影 吃了减肥药怀孕怎么办 win10玩不了qq堂怎么办 电脑只有c盘了怎么办 美拍直播没人看怎么办 洛神花孕妇喝了怎么办 黑枸杞泡水褐色怎么办 红薯吃多了胃胀怎么办 在赌场掉了筹码怎么办? 到缅甸被绑架了怎么办 在淘宝不给退货怎么办 鞋上魔术贴坏了怎么办 手机支架不粘了怎么办 赌博把房子输了怎么办 当发现老公有外遇时怎么办 led灯带中间不亮怎么办 飘窗的天花板凸怎么办 一受委屈就爱哭怎么办 6岁儿童叛逆期怎么办 孩子高一了厌学怎么办 除上有肥胖纹怎么办 6岁不爱写作业怎么办 初中孩子不爱写作业怎么办 孩子上课走神写作业慢怎么办 孩子作业写得慢怎么办 4岁宝宝不写作业怎么办 小孩作业写得慢怎么办 3岁宝宝不写作业怎么办 小孩不写作业怎么办呀 作业没写完的人怎么办? 孩子不写作业家长该怎么办 做作业做得慢怎么办 高一作业写得慢怎么办 孩子做作业不认真怎么办 孩子不主动做作业怎么办