servlet_jsp 专题专题Servlet_JSP

::::::::::::::::::::::::::::::::::tomcat:::::::::::::::::::::::::::::::::::

Server version: Apache Tomcat/6.0.18

Server built:   Jul 22 2008 02:00:36

Server number:  6.0.18.0

OS Name:        Linux

OS Version:     2.6.27-11-generic

Architecture:   i386

JVM Version:    1.6.0_10-b33

JVM Vendor:     Sun Microsystems Inc.


javac -version :javac 1.6.0_10

jre 1.5



::::::::::::::::::::::::::::::::::servlet::::::::::::::::::::::::::::::::::::

server lettle (字母)一小段应用程序

TestHTTP.class   :http 是什么东西 :我写一点东西过去,他返回一点东西给我


Socket s = newSocket("127.0.0.1", 8888);

      PrintWriter pw = new PrintWriter(newOutputStreamWriter(s.getOutputStream()));

      pw.println("GET / HTTP/1.1");

      pw.println("Host:localhost");

      pw.println("Content-Type:text/html");

      pw.println();

      pw.flush();

      BufferedReader br = new BufferedReader(newInputStreamReader(s.getInputStream()));

      String str = "";

      while ((str = br.readLine()) != null) {

          System.out.println(str);

      }

      br.close();

      pw.close();

      s.close();


::::::::::::::::::::::::::::::::::::::::::::::第一个servlet 程序::::::::::::::::::::::::::


符合j2ee WebApplication 就是一个个目录:结构比较固定


webapps/   下建立webapplication

1.must hava :WEB-INF folder ; in it youmust have file web.xml

2.don't make static pages ...in WEN-INFfolder it's used by TomCat

3.make a 01.html under test application orfolder in it have 02.html

4.  http://localhost:8888/test/01.html

   http://localhost:8888/test/ao.02.html is visit your web application

通过一层server 跟本地打开不一样相对url


  in java ee sun don't give you jar package only interface for

  API javax.servlet and javax.servlet.http you use

  TomCat 实现 sun 的标准(interface)

  where is it: tomcat/lib/servlet-api.jar

打开servlet-api.jar sun 定义的接口是一一对应的;

  servlet-api.jar 是对API 文档的实现

实现接口的class 文件就在 jar 包里


we must buildpath add jar to our project

写一个servlet newHelloWorldSerlet.class  (not so easy)


all servlet must implement servletinterface


servlet 是可以在任何服务器端运行的程序service() 方法被所有服务器自动调用)

我们写的是专门在http 服务器端运行的程序


adpter GenericServlet abstract classimplemented interface (通用的)

abstract class HttpServlet extendsGenericServlet (专门给web server 使用的 servlet)

一个servlet 被调用,实际上是调用 service() 方法;

一般我们不重写service()方法; service() 默认帮我们调用 doGet() ,doPost()

我们只须重写doGet(), doPost();

shift + alt + s (重写方法)


doGet(HttpServletRequest request,HttpServletResponse response)


客户端访问服务器发送自己的请求:request 传递给服务器,服务器调用 servlet;

服务器往response 里写的东西,就是要发送给客户端的。


  request 封装了客户端的一系列的请求response 服务器端返回给客户端的那个对象

客户端用get 方式来访问我们servlet 的时候; doGet() 被调用

what is get:    直接敲我们的url 地址;就是get 方式

what is post:    form 里点提交 and form method is post 就是post 方式


读一下新的类,新的接口;



servlet 不可以在eclipse 里运行 servlet tomcat 容器调用的,把它放在tomcat application

WEB-INF 里有一个文件夹classes 放编译好的 servlet class 文件


Navigator 视图:显示真正目录下面我们的项目是什么形式ubuntu 下不能复制!!!)


what url is use the servlet : web.xml 配置文件里配置


  <servlet>                            //表示在容器里有一个servlet

  <servlet-name>HelloWorldServlet</servlet-name>        //名字随便取

  <servlet-class>HelloWorldServlet</servlet-class>    //classes 目录下class 的名字

  </servlet>                            //copy class name

                                   //servlet 定义好了算

  <servlet-mapping>                        //servlet 映射

  <servlet-name>HelloWorldServlet</servlet-name>        //名字和上面定义的一样

  <url-pattern>/first</url-pattern>            //url 里敲什么调用this servle

  </servlet-mapping>                        ///’开头   is web application根路径


分析运行过程:

  we type url www.localhost:8888/test/first

  to find if have <url-patten> is "/first"

  have it ,next visit servlet named HelloWorldServlet

  HelloWorldServlet'class is HelloWorldServlet

  calling method of HelloWorldServlet object's doGet() .

  so tomcat'backstage "System.out.println("doGet")";ok~


tomcat 后台Reloading context 说明我们的配置起作用了


:::::::::::::::::::::::::::::::::晚上搞了很久的错误::::::::::::::::::::::::::::::::::::::



HelloWordServlet.java 不用运行的myeclipse 里也运行不了  //就这个想他运行搞了很久

class 放到 test web application 下,class 改动一次要重新放一次   //tomcat 也要重启

改动 web.xmltomcat 不需要重启                   //tomcat 自动 reloading context


       ubuntu tomcat 启动看不到后台

没办法在myeclipse 里启动 tomcat

web project 项目文件点右键->myeclipse”->Add and remove project deployment

默认的 myeclipse tomcat 不要 add 一个

  windows--show view-- Myeclipse java enterprise --servers   //可以看到后台了;这把我搞乱了

差点想重装 myeclipse 气死了;;;;;

::::::::::::::::::::::::::::::::::回来继续:::::::::::::::::::::::::::::::::::::::::::::::


response.getWriter().write("<ahref='http://www.bjsxt.com'>go</a>"); //往客户端写点东西

                                    //有双引号了,用单引号


服务器调用servlet 写给你 html页面,数据库内容... 你请求什么我给你发什么; 改变/test/后面的东西就ok

只要你有写那个servlet 请求就可以得到响应


:::::::::::::一个servlet 要想正常运行

1. class 放到 WEB-INF 目录下的 classes 目录里

2.正确部署servlet web server or container


::::::::::::::::::::::::::::::::::Servlet 生命周期::::::::::::::::::::::::::::::::::::::::::::


  public TestLiftCycleServlet() {

      System.out.println("constructor");

   }

  protected void doGet(HttpServletRequest req, HttpServletResponse resp)

          throws ServletException, IOException {

      System.out.println("deGet");

   }


  public void destroy() {

      System.out.println("destroy");

   }


  public void init(ServletConfig config) throws ServletException {

      System.out.println("init");

   }

TestLiftCycleServlet.class  初始就让他继承 httpservlet  

override :init(arg);doGet(); destroy(); +constructor ()  inition 开始)

web.xml add new servlet


1. constructor :没有构建怎么调用其他的方法阿

2.constructor --- init----doGet

3.calling again (刷新)

4.constructor -- init -- doGet --doGet        //只执行一次,第一次初始化的时候

5.同个 container servlet new 一个对象;所有人都访问的是这个对象(省内存)    //有些容器 can new more 构成池


  Interface SingleThreadModel Deprcated (废弃了)  每当别人发一个请求,就new一个新对象

6.init(ServletConfig config)  ServletConfig 对象保持着 servlet 配置信息 in web.xml




:::::::::::::::::::::::::::::::::使用doGetdoPost方法处理请求(request):::::::::::::::::::::::::::::::


      ThreeParams.html/ThreeParams.java

把源文件都copy navigator src 粘贴


有时间把方法都打印出来看看没有getParameter() 方法,就是父类里有!!!


get 参数名,参数值跟后面,post 不跟后面




::::::::::::::::::::::::::::ShowParameters.java/ShowParametersForm.html::::::::::::::::::::::::

java.util Interface Enumeration isduplicated by the Iterator interface   Interator 替代


Enumeration 是历史遗留问题 servlet 有的时候还没有 Iterator (网页是下下来的)


getParameterMap()  代替 Enumeration   (作业


:::::::::::.htm:::::::::::::::  ::::::::::::::::::::web.xml:::::::::::::::::::::::

ACTION="/ao/ShowParametersMap" <url-pattern>/test/ao/ShowParametersMap</url-pattern>


否则异常:

HTTP Status 404 - /ao/ShowParametersMap

type Status report


message /ao/ShowParametersMap


description The requested resource(/ao/ShowParametersMap) is not available.


:::::::::::::::::::::::::::::::::::::::cookie  (kuki)::::::::::::::::::::::::


http 无连接性,请求,响应完就断开连接了;(去第二个页面结账已经不认识你了)

(解决:买完东西:*给你在客户端做记录*)this is cookie

                    //每个浏览器有独一无二的编号

应用:(1)没有cookie 就买不了书2)有些网站不能打开(3)两周内不用重新登录

两周内不用重新登录

0:cookie 是名-值

1:服务器可以向客户端写内容

2:只能是文本内容

3:客户端可以阻止服务器写入

4:只能拿自己webapp写入的东西         //新浪不能拿搜狐的cookie

5:Cookie分为两种

属于窗口/子窗口 ---没有设置setAge();(放在内存中的)    //没有生命周期,窗口关了就没有了

属于文本(有生命周期的)                 //谁都可以访问

  //打开新窗口,showcookies只能看到有生命周期的cookie

  //ctrl + n  windows.open  从浏览器里打开新窗口(父子关系)拥有原窗口cookie (ie ok)

6:一个servlet/jsp设置的cookies能够被

同一个路径下面或者子路径下面的

 servlet/jsp读到 (路径 = URL)

 (路径 != 真实文件路径)


实验:(先删了所有的cookies

1 /servlet/setcookies  /showcookies    看不到:老子想看儿子的不可能

(2)/setcookies       /servlet/showcookies    儿子看老子的ok


:::::::::::::::::::::::::::Session (会话跟踪):::::::::::::::::::::::::::::::

asp   asp.net 都一样1.cookie 2.session 3.application  17 总结)


配置:SessionInfoServlet  ShowSession


cookie 不可靠,可以阻止,可以手动删

session :把信息记录在服务器端


客户端来访问时候;服务器端给你开辟一块内存就是session 跟客户端浏览器窗口或子窗口关联在一起的

新窗口 session


原理:

服务器:给每个浏览器一个独一无二的号码;同时给相应的session  赋予同样的号码

服务器端记录了一系列的session  当你访问第二个页面的时候,

把号码发给第二个页面,第二个页面去找与这个号码对应的 session

这个号码就是sessionID



session 两种实现:(面试老问)

1.通过cookie 实现(如果浏览器支持cookie

创建session时,把sessionID 存储在临时的cookie

浏览器窗口关了   sessionID 就没有了服务器中清除内存

  showcookies 可以显示出 sessionID

2.通过自己编程,使用url重写来实现    (response.encodeURL(); 1.转码(中文) 2.URL 后面加入SessionID)

禁了cookie 每次刷新 sessionID 都改变(有的IE 禁不了 cookie ;同时url后面不跟 sessionID

不禁cookie 每次刷新 sessionID 不改变    (firefox 不禁 cookie URL后面不加ID)


  out.println("<br><a href=" +response.encodeURL("SessionInfoServlet") +">refresh</a>");

      servlet 写错了我晕

给每个要支持session链接加上 response.encodeURL() 你的session 就永远有效

(完美但是麻烦,所以大公司就认为你就应该支持 cookie 不写session: main.sina.com.cn

登录邮箱后给你个sessionID 再访问别的页面的时候就知道是你了  cookie 禁了就登录不了了

他没有写encodeURL() 就没有 sessionID 了进不去 sun 都有写的

比较重要的应用写encodeURL() 赶时间就不用写了

改过后就要重新部署class copy to classes 重启 tomcat


禁了cookie 写了encodeURL() 后点刷新ID变;点 refesh sessionID 不变并且加在URL 后面

所以每个URL加这个方法就有固定的sessionID


服务器给你建session 后,开始记时间,多久没有访问就删除这个session 重新访问重新记时间

session 又过期时间

登录邮箱,在那里狂敲邮件,发送,session 已过期,没有跟服务器端及时联系

新浪看网页,又去搜狐,能back回来,新浪session 没有过期


tomcat conf/web.xml 所有web application 都用, 可以拷过来,自己该时间

<session-config>

      <session-timeout>30</session-timeout>  分钟

  </session-config>


session 是服务器中的一块内存,可以往里面写任何的东西


void setAttribute(String name Objectvalue)   名字永远是String 类型类似cookie 名-值对

往服务器里写东西:::


4访问次数加一

showsession.class   访问次数,刷新一次,加一;新建窗口,访问次数归0;(一个窗口对应一个session


session 不存在cookie 路径不能访问的问题

只要是同一个窗口/test/Servlet/SessionInfoServlet  建立的ID 可以被ShowSession 拿到



MIME                        

Multipurpos Internet Mail Extension

指明白传送内容的格式

最早用于邮件附件


::::::::::::::::::::::::::::::application    ::::::::::::::::::::::::::::::


      session 之给一个客户端访问

      application 让所以的客户端都可以访问



对应的类

ServletContext(每一个 web application 的运行环境叫一个context servletcontext servlet 运行的上下文环境)

servlet run in web application webapplication is servlet' context

what is one servlet'servletcontext ? It'shole web application .

put sth in web application , so everyonecan share it;


计算整个webapplication 生存期间访问某个页面一共有多少个客户端(记录在application 里)


所有类的对象都共享application     就像静态方法forward.jsp / forforward.jsp


TestServletContext    每次刷新都自动加1  ,新起窗口,刷新继续加1


:::::::::::::::::::::::::::::::部署带包的class:::::::::::::::::::::::::::::



部署带包的 class 连包名一起拷到 classes

com.bjsxt.servlet.HelloWorldServlet

web.xml 中配置 name, url-pattern 随便起; servlet-class:com.bjsxt.servlet.HelloWorldServlet




:::::::::::::::::::::::::::::::::::::::JavaBean(咖啡豆) 支持组件::::::::::::::::::::::::::::::::::::


sun 发明了在java  怎么使用组件一系列的类中和在一起共同对外提供服务

VB 的一个按钮就是一个组件



JavaBean 狭义的:sun 规定的关于 JavaBean的标准 ;有界面形式的体现

JavaBean 广义的:就是一个普通的Java


Servlet中使用Bean和在通常程序中使用Bean类似

  1.属性名称第一个字母必须小写,一般private,比如:private productId

属性不让别人访问,只有自己能访问;类的封装;掩藏细节

  2.一般具有gettersand setters;要具有一个参数为空的构造方法

别人通过方法访问属性的值

  3.Bean不应具有GUI表现;一般是用来实现某一业务逻辑或取得特定结果



:::::::::::::::::::::::::::::::::servlet 中访问数据库::::::::::::::::::::::::::::::::::::::::


mysql select * from article; 乱码 set names 'gbk';


找到错误的开头再看,不然就是断章取义了   ClassNotFoundException

引人包也找不着阿class web application 里运行;你把包加到项目里有什么用


WEB-INF/lib    中加入相应的jar   (用于运行,项目中用于编译和运行)   // 重启 tomcat


  ::::::::::::::::::出错越多,能力越强;;;关看程序,不写程序,永远出不了错:::::::::::::::::

  ::::::::::::::::::不怕你出错,就怕你出了错后,手足无措::::::::::::::::::::::::::::::::




每次连接数据库都要写重复的代码;我们把这个连接过程代码封装到一个类里;DB.java (封装)(自己学会常见东西封装类)


servlet 里使用 JavaBean 就是在 servlet 里使用别的类(类要有上面说的特点)



1.直接连数据库ShowRs.java

2.JavaBean 封装连数据库DB.java + ShowRsUseBean.java  (有异常去DB 里处理)




:::::::::::::::::::::::::::::::::JSP  JSP JSP :::::::::::::::::::::::::::::::::::::::::


          JSP---Java Server Pages

拥有servlet的特性与优点(本身就是一个servlet)

servlet out.println() 太麻烦了

HTML中内嵌JSP代码    JSP 就像 HTML 一样使用它

HTML 放哪里 JSP 就放在哪里,不用配置直接访问(跟HTML 一样,别放在 WEBINF 目录下)


out.println("HelloWorld!");   out 输出流,打印到客户端

out.println(new java.util.Date());


JSP 运行原理

   1work 目录存放编译 JSP 转换完成后的 class文件,java文件JSP 转成Servlet 再运行)

第一次访问要转换和编译,慢一些;

      out.write("<html>\r\n");

      out.println("HelloWorld!");


JSP 4套语法:1:传统语法;2JSTL(替代传统语法)3JSF(替代 JSTL(好东西推广不好,都会最好)4:其他taglib (struts)  (哪个招的人最多就学那个;JSTL  项目中直接用,JSF 简单介绍)


ASP ASP.NET 完全两码事



:::::::::::::::::::::::::::::::::JSP 传统语法:::::::::::::::::::::::::::::::::

JSP传统语法

  *Declaration           (声明)

  *Scriptlet        (小程序段)

  *Expression        (表达式)

  *Comment        (注释)

  *Directives        (编译指令)

  *Action动作指令(动作)

   *内置对象




:::::::::::::::::::::::::::::::::Declaration(声明):::::::::::::::::::::::::::::::::::::


基本语法 <%! %>  (成员变量)            AccessCounts.jsp

说明:在此声明的变量、方法都会被保留成唯一的一份,直到JSP程序停止执行

回一

刷新的时候,后台还没有来的及重新编译过来  reload 一遍刷新过程中他给reload


错误: <%voidm()%>    //把方法声明在方法里面了


出现错误浏览器会报错;;resolved 下定义)

1.打印调试; 2.删一段再运行; JSP支持DEBUG (logbox)



:::::::::::::::::::::::::::::::Scriptlet (小程序段):::::::::::::::::::::::::::::::::::


基本语法:<%程序代码区%>                BGColor.jsp?bgColor=red(动态改变服务器端)

                       <%= 赋值%>

*    可以放入任何的Java程序代码


注释格式:

      <%----%>    客户端源码可以看见

      <%//… …%>

      <%/*… …*/%>



:::::::::::::::::::::::::::::::Expression(表达式)::::::::::::::::::::::::::::::::


基本语法: <%=%>        Expressions.jsp    ?testParam=abcde (加空格转化为%20)

firefox 不转)


   *=后面必须是字符串变量或者可以被转换成字符串的表达式

   *不需要以;结束

   *只有一行



:::::::::::::::::::::::::::::::Directives(编译指令):::::::::::::::::::::::::::::::::::::


Directive(编译指令)相当于在编译期间的命令

格式:<%@Directive属性=“属性值”%>

常见的Directive

  1.page

  2.include

  3.taglib    (以后再讲)


::::::::::::::::::::::::::Directive-page :指明与JSP Container 的沟通方式::::::::::::::::::::::::::::

                       //编译期间,指明白页面特点

基本格式:

<%@page language=script language|               //不能有空格

          extends=“className”|

          import=importList|   --*引入的包名

          buffer=none|kb size|  --none:不缓冲,默认8k缓冲区

          session=true|false|  --是否可以使用session 对象,第一次使用对象给你创建一个session,默认true

          autoFlush=true|false --缓冲器是否自动清除,默认true

          isThreadSafe=true|false|  --默认false(永远不要设成true) 实现SingleThreadModel Deprcated

          info=infoText|   --任何字符

          errorPage=errorPageUrl| --*页面出错后显示什么页面的内容

          isErrorPage=true|false| --*当前页面是不是显示错误的页面

          contentType=contentTyepInfo|  --"text/html" charset  2312

      pageEncoding=“gb2312”

%>




TestDirective.jsp

TestErr.jsp

ErrPage.jsp



:::::::::::::::::::::::::::::Directive-include将指定的JSP程序或者HTML文件包含进来::::::::::::::::::::::::::


TestBar.jsp

TitleBar.jsp


<%@include file=fileURL%>     //先原封不动的包含进来,再编译,编译指令(Directive


<%@ includefile="TitleBar.jsp?user=aa" %>  //"/TitleBar.jsp?user=aa" not found 编译指令不能往里面传参数

                                       //还没有运行呢

包含非动态的代码(不接受参数的代码)编译时候包含,执行效率比较

不能向fileURL中传递参数

不能abc.jsp?user=aaa




:::::::::::::::::::::::::::::::Action   (运行期间指令)::::::::::::::::::::::::::::::::::::::::::::::::


常见的 (4):

  1.jsp:useBean

      jsp:setProperty

      jsp:getProperty

  2.jsp:include

  3.jsp:forward

      jsp:param

  3.jsp:plugin

嵌入applet (很少用了  ajax 出现后)




::::::::::::::::::::::::::::::::Actionjsp:include ::::::::::::::::::::::::::::::::::::::::::::::::


用于动态包含JSP程序或HTML文件等

除非这个指令会被执行到,否则它是不会被TomcatJSP Engine编译。

格式:

  <jsp:include page=URLSpec flush=true/>      //没有@ flush="true" 赶快输出

  <jsp:include page=“URLSpec” flush=“true”>

          <jsp:param name=ParamName value=paramValue/>    //子标签

      </jsp:include>

jsp:param :用来设定include文件时的参数和对应的值


include.jsp

date.jsp



两种包含的区别:compute.html;compute.jsp;divide.jsp;;multiply.jsp

String value1 =request.getParameter("value1");  //返回值是String 类型检验是不是空

request.getParameter("compute")              //检验是不是空值  NoPointException



运行指令和编译指令include的区别 (Directive-include)


1.include 属性名不同 <%@include file    <jsp:include page


2.include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入


3.Include不能带参数, <jsp:include>可以


4.动态包含的文件和被包含文件用的是同一个request对象




::::::::::::::::::::::::::::::::::::::::Action  jsp:forward::::::::::::::::::::::::::::::::::::


用于将一个jsp的内容传送到page所指定的JSP程序或者Servlet中处理(URL)

格式:

  <jsp:forward page=urlSpec flush=true/>        //没有参数

  <jsp:forward page=urlSpec>            //有参数

          <jsp:param name=“paramName” value=“paramValue”/>

  </jsp:forward>

<jsp:param>用于指定参数和其对应的值




forward.jsp     //url 输入forward.jsp 显示的是 forforward.jsp  url 中显示的是forward.jsp

forforward.jsp

test.jsp    //response.sendRedirect("forforward1.jsp");

      //转到forforward1.jsp    不能传参数            url 中显示的是 forforward.jsp


(用处)跳转:

根据不同的(登录信息)用户名跳转到不同的页面

看你用户名不对让你重新登录



forward1.jsp

forforward1.jsp



分析:

  forward1.jsp

  <jsp:forward page="forforward1.jsp">

      <jsp:param name="name" value="m" />        //参数名;值固定了没有用request.getParameter()方法

      <jsp:param name="oldName"value='<%=request.getParameter("name")%>' />

      <jsp:param name="roles" value="manager" />

  </jsp:forward>


  forforward1.jsp

  <%=request.getParameter("name")%>        //forward1.jsp name 的值 "m"

  <%=request.getParameter("oldName")%>        //url 中输入的 name=aoople

  <%=request.getParameter("roles")%>        //显示 manager

  <%=request.getParameter("ccc")%>        //forward1.jsp?ccc=aoople 可以拿到

  //这个request =forward1.jsp 中的request     //同一个request forward1.jsp传过去了



  test.jsp    //也是跳转到forforward1.jsp

  <%

      response.sendRedirect("forforward1.jsp");

  //这里的request !=forward1.jsp 中的request 对象

      System.out.println("ddd");

  %>



  <jsp:forward>response.sendRedirect的区别:


  <jsp:forward>

使用同一个request    只发起一次请求 (request)

      forward后的语句不会继续发送给客户端

速度快

服务器内部转换,无声无息转到另一个界面,客户端不知道

可以传参数

  response.sendRedirect        //请你重新访问另一个页面

是不同的request        发起两个请求

      send后的语句会继续执行,除非return

速度慢

需要到客户端的往返,可以转到任何页面

可以传参数,直接写在url后面




:::::::::::::::::::::::::::::::::::::Action  jsp:useBean (使用JavaBean:::::::::::::::::::::::::::::

               StringBean.jsp

               StringBean.java


jsp:useBean    : JSP中使用定义好的Bean


Bean的基本要素:

必须要有一个不带参数的构造函数。在JSP元素创建Bean时会调用空构造器

  Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,变量名称首字母必需小写

通过getter/setter方法来读/写变量的值,并且将对应的变量首字母改成大写

基本用法:

   test.jsp/CounterBean.java     不要使用裸体类(规范要求)  package bean;


javabean  连包名一起放到   web-inf/classes 目录下


jsp:useBean各项参数含义:

  id:对象实例名称

  scope:Bean作用的范围,默认为page,对整个jsp页面有效

  class:Bean类名称(全名)

  type:Bean实例类型,可以是本类,或其父类,或实现的接口,默认为本类


Scope各项参数的意义:

   page:仅涵盖使用JavaBean的页面

PageBean.jsp/CounterBean.java        //两次getCount()  

request:有效范围仅限于使用JavaBean的请求

RequestBean.jsp/RequestBean2.jsp/CounterBean.java   //没有CountBean new 一个(名:值对)

                               //同一个request 拿到的bean 就是同一个

                               //forward 的是(101),方法的不是1

session:有效范围在用户整个连接过程中(整个会话阶段均有效)

SessionBean.jsp/Session2.jsp/CounterBean.java   //当前窗口或子窗口刷新会 ++

                               //输入sessionbean2.jsp 也会++

                               //firefox 新起一个也++ ??怪了

application:有效范围涵盖整个应用程序。也就是对整个网站均有效

Application.jsp/Application2.jsp/CounterBean.java   //重启tomcat 打开新窗口1




有两种语法:练习的时候用不熟悉的语法,写程序的时候用熟悉的


<%@ page import="bean.*" %>


<%--


<%response.sendRedirect("../servlet/ShowRs"); %>


<% CounterBean cb = new CounterBean();%>


<font color="red"size="5">

  <%=cb.getCount()%>

</font>

--%>


oooooo   两个注释了还是不能执行,不能一起放,分开来执行

<jsp:useBean id="cb"class="bean.CounterBean" typ="java.lang.Object>    Object cb = new CounterBean() 引用指向子类对象


<jsp:useBeanid="cb"class="bean.CounterBean" >                

等于<% CounterBean cb = newCounterBean(); %>

</jsp:useBean>    

HTML 但是那个公司让美工写JSP代码的阿            scope=page         局部变量,页面没有方法消失

虽然有方法publicint getCount() { count++; return count; }  每次刷新,都所新的值,不会++


<jsp:setProperty name="cb"property="count" value="23"/>         <%--cb.setCount(Integer.parseInt("23")) --%>

<jsp:getProperty name="cb"property="count"/>                    <%--out.print(cb.getCount()) --%>




:::::::::::::::::::::::::::::::::::jsp:useBean配套用的两个子标签:::::::::::::::::::::::

:::::::::::::::::::::::::::::::::::jsp:setProperty::::::::::::::::::::::::::::::::::

:::::::::::::::::::::::::::::::::::jsp:getProperty::::::::::::::::::::::::::::::::::



建立表单参数和Bean属性之间的关联

  1.通过param指定表单元素的名称,通过perperty指定对应的Bean属性名称,由此建立这两个变量的关联


SaleEntry.jsp/SaleEntry.java,用url传递参数)

  2.通过*来设置所有属性和输入参数之间的关联


         (SayHelloBean.html/SayHelloBean.jsp/HelloBean.java)

  3.在建立Bean属性和表单参数之间的对应关系时,服务器会将对应的参数自动转换成和属性类型匹配的数据



1.

报错:(上网一查)

      value="<%=request.getParameter("itemID")%>"/>

      /SaleEntry.jsp(26,14) Attribute value request.getParameter("itemID")is quoted with " which must be escaped when used within the value



改错:  value="<%=request.getParameter('itemID')%>" />


  <jsp:useBean id="entry" class="bean.SaleEntry"/>    //new 出一个bean的实例 entry



  param="numItems" />   ====等同于====    value="<%=request.getParameter("numItems")%>"


  request.getParameter("numItems")   拿到的是String 类型;    numItems Int 类型服务器自动转换



   <TD>$<jsp:getProperty name="entry"property="totalCost" />

          //没有totalCost 属性,但会调用getTotalCost()方法

           //怎么调的阿

   Cc = new C;  c.get*();      要在知道有C 的前提下才能newJSP知道有SaleEntry 这个类吗:反射机制


2.

  <jsp:useBean id="hello" class="bean.HelloBean"scope="request" >

  <jsp:setProperty name="hello" property="*" />

  </jsp:useBean>


form 里的内容传到jsp 里去*的setProperty 都写了,传那个调那个


html form 里的name ; jsp 里有对应的 property    没有就找不到了


手写用的很少, strus里用的巨多




:::::::::::::::::::::::::::::::::;;request.setCharterEncoding("gb2312"):::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::中文乱码问题::::::::::::::::::::::::::::::::::::::::::




乱码中间经历了那些环节,确定在那个环节上出了问题

1.提交过去

2.set方法

3.get方法


set方法后面打印    <%=request.getParameter("name")%> 是乱码

提交过来后就是乱码了


最原始的解决办法;放到四海而皆准的办法:转码

<%

String name =request.getParameter("name");

out.println(new String (name.getBytes("ISO8859_1"),"GBK"));

%>

name.getBytes() 分解成一个一个字节,构建成一个字节数组

重载,按ISO8859_1 编码name 分解成最原始的字节数组传输过程中是安这个编码进行编写的

new String (原来编码,指定编码的集合);


能解决任何关于编码问题,但是要认清他原来的编码是什么,你要转成的编码是什么


使用一个简单的方法:request.setCharacterEncoding("GBK");

你是通过request 传过来的,你先把request 里的内容转化为GBK 编码

就不用下面的手动编码了




::::::::::::::::::::::::::::::::::::::JSP 内置对象::::::::::::::::::::::::::::::::::::::::



JSP的内置对象  (9)   (API 文档)

  out

  request

  response

  pageContext  *用的很少(这个page运行的环境,类似于servletContext,马士兵没有用过,写JSP 容器有用)

  session

  application

  config  *用的很少servlet 要配置,JSP不用配置,类似web.xml

  exception

  Page *用的很少(很少用,因为当前页面的所有内容我们直接就可以访问,成员变量,局部变量)


牢牢记住其他的6个对象,

面试题:请你写出JSP 常用的内置对象,以及他们常用的方法(遇到N次了)


::::::::::::::::::::::::::::::::::::JSP 内置对象OUT::::::::::::::::::::::::::::::::::


Out内置对象是一个缓冲的输出流,用来给客户端返回信息。

它是javax.servlet.jsp.JspWriter的一个实例

典型应用:向客户端输出内容


例:向客户端输出一个字符串“Hello World

  (HelloWorld.jsp)



常用方法:

  println():向客户端输出各种类型数据    (常用的) write()

  newLine():输出一个换行符(常用的)

  close():关闭输出流

  flush():输出缓冲区里的数据

  clearBuffer():清除缓冲区里的数据,同时把数据输出到客户端

  clear():清除缓冲区里的数据,但不把数据输出到客户端

  getBufferSize():返回缓冲区的大小



::::::::::::::::::::::::::::::::::::JSP 内置对象request::::::::::::::::::::::::::::::::::


request内置对象表示的是调用JSP页面的请求。

通常,request对象是javax.servlet.http.HttpServletRequest接口的一个实例


典型应用:

通过request.getParameter(paramName)可以获得Form提交过来的参数值



可以用此对象取得请求的Header、信息(如浏览器版本、语言和编码等)、请求的方式(get/post)、请求的参数名称、参数值、客户端的主机名称等

常用方法:

  getMethod():返回客户端向服务器端传送数据的方法

  getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定

  getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration

  getParameterValues(String  name):获得指定参数的所有值,由name指定

  getRequestURI():获得发出请求字符串的客户端地址

  getRemoteAddr():获取客户端的IP地址

  getRemoteHost():获取客户端机器名称

  getServerName():获取服务器的名字

  getServletName():客户端所请求的脚本文件路径

  getServerPort():获取服务器端的端口8888

对应类:javax.servlet.http.HttpServletRequest




::::::::::::::::::::::::::::::::::::JSP 内置对象request::::::::::::::::::::::::::::::::::



表示的是返回给客户端的响应

javax.servlethttp.HttpServletResponse接口的一个实例

经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL


常用方法:

  addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息

  addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端

  containsHeader(String name):判断指定名字的HTTP文件头是否存在

  sendError(int):向客户端发送错误的信息           //(int) http 错误码 404(找不着) 500(服务器内部错误)

  sendRedirect(String url):重定向JSP文件

<jsp:forward>的区别

      sendRedirect通过客户端发起二次申请,不同的request对象

      Jsp:forward是同一个request,在服务器内部转发

setContentType(String contentType):设置MIME类型与编码方式  (contentType="text/html;charset=gb2312" )



::::::::::::::::::::::::::::::::::::JSP 内置对象cookie::::::::::::::::::::::::::::::::::



Http协议的无连接性要求出现一种保存C/S间状态的机制


Cookie:保存到客户端的一个文本文件,与特定客户相关


Cookie以“名-值”对的形式保存数据


通过getNamegetValue的方式得到相应的名字和值



addCookie



::::::::::::::::::::::::::::::::::::JSP 内置对象session & application:::::::::::::::::::::::::::



<% @page session=true%>(默认)--表示session功能已经在jsp页面中启动


session常用方法:

  void setAttribute(String name,Object value)

  Object getAttribute(String name)

  boolean isNew()

application

  ServletContext (对应的类,去API 里查就是了setAttribute,getAttribute)




::::::::::::::::::::::::::::::::::::ServletJSP的通信 :::::::::::::::::::::::::::::::::::::::



Servlet 跳转到一个 JSP JSP 怎么跳转到一个 Servlet ;



JSP  可以通过,forward, sendRedirect(Stringurl) 跳转到任何url 地址


部署: servlet

编译 ServletToJSP.java       //大小写不要写错了

class copy classes 目录下

配置 web.xml

  ServletUseJsp.jsp   copy test 根目录下


分析:

  1.FromJspToServlet.jsp :跳转到ServletToJSP  (你也可以用 sendRedirectredirect :重新寄送

  2.ServletToJSP   servlet 又跳转到 ServletUseJsp.jsp

  3.

JSP调用Servlet可用<jsp:forward>

请求信息自动传递到Servlet

或者通过sendRedirect


Servlet调用JSP使用

RequestDispatcher接口的forward(req, res)方法

请求信息需要显式传递(reqres参数中)

或者通过sendRedirect


例如:

FromJspToServlet.jsp / ServletToJsp.java /ServletUseJsp.jsp

forward可以用/路径, 是指web app的根路径, servlet forward jsp的时候一定要用/”开头

jsp sendRedirectservlet应该用相对路径,因为这里”/”指网站的根路径

servlet sendRedirect jsp也是

request.getContextPath起作用了