JSP第一天2008年5月28日一、JSP(javaserverpage)1、JSP是服务器端运行的页面,JSP本身就是一个文档,他不仅可以包含静态的HTML代码,也可以包含动态的JAVA代码,服务器容器可以将JSP转换成Servlet发布,并接受请求。2、JSPisaServlet!tomcat-5.5.17\conf\web.xml文件中servletservlet-namedefault/servlet-nameservlet-classorg.apache.catalina.servlets.DefaultServlet/servlet-classinit-paramparam-namedebug/param-nameparam-value0/param-value/init-paraminit-paramparam-namelistings/param-nameparam-valuetrue/param-value/init-paramload-on-startup1/load-on-startup/servlet当listings属性设置为true时,直接用应用名字访问的时候,会把应用的所有文件目录列出来,系统发布的时候置为falsetomcat-5.5.17\conf\server.xml文件中Connectorport=8080maxHttpHeaderSize=8192maxThreads=150minSpareThreads=25maxSpareThreads=75enableLookups=falseredirectPort=8443acceptCount=100connectionTimeout=20000disableUploadTimeout=true/可以修改端口,前提是系统中没有占用的端口,改为80的时,访问可以不写端口,默认值,系统发布时用3、Jsp文件只需放在应用文件下就可以了。4、JSP例子:htmlheadtitletime/title/headbodyh1%=newjava.util.Date()%/h1/body/html5、JSP的特点(1)JSP不需要编译(2)JSP不需要进行配置(3)JSP本质上就是一个Servlet(4)JSP是以静态页面为主的。6、JSP运行过程(1)JSP文件先要翻译成Java文件(Servlet),在tomcat中翻译后的java文件在tomcat下的work\Catalina\localhost中相应名字的应用目录里。(2)编译Java文件(3)运行.class文件7、%@...%JSP指令%!...%JSP声明%=...%JSP表达式%...%JSP代码块8、生命周期jspInit()_jspService()jspDestroy()9、JSP的语法元素(1)Scripting脚本(代码)a)declaration声明%!inta=0;%使用声明的变量,所创建的变量是在service方法体外,也就是翻译成实例变量,声明也可以声明内部类或者是方法的声明。b)expression表达式%=...%写表达式时不要加上分号,表达式,翻译成Java代码也就是直接使用流输出,out.print()的参数,也就不能加分号了。c)scriptlet代码块%if(a==0){a=3;}%代码段会原样翻译。在代码段中声明的变量,就会被翻译的service的方法体中,也就是被翻译成局部变量。(2)action动作(3)directive指令%=newObject(){}%---表示匿名内部类%=getParameter(user,request)%--从请求中取参数JSP第二天2008年5月29日JSP的注释%--........--%JSP指令和JSP动作(标准的JSP标签)JSP指令的语法%@page指令%%@include指令%%@taglib指令%%@includefile=....%包含指令,包含指令会将要包含的文件代码原样输出到本页面(在翻译时把包含文件的内容引入并合并),被包含的文件不会进行单独的翻译,不会生成单独的Java与class文件。file属性制定要包含的文件的名字(注意要包含的文件的路径),这个指令可以实现页面的复用。注意:%@includefile=%要包含的JSP文件中不能出现与被包含的jsp文件中已经使用的变量名,如果不使用包含指令,那么JSP中的最小转换单元就是JSP文件,使用了包含指令就会将多个jsp的结果合并到一起。%@page..%页面指令%@pageimport=...%引入包例:%@pageimport=java.util.*,ent.*%(可出现多次)%@pagepageEncoding=GBK%设定页面显示的字符集,发生在运行阶段%@pagecontentType=text/html;charset=GBK%设置输出流的编码方式和文件格式,发生在编译阶段。注意:输出的字符集编码方式要和页面显示的字符集相同,一般定义输出流的编码方式,注意以上两个页面指令在JSP中最好只出现一次。注意在请求中传送的参数的值是中文的话需要调用请求request的setCharacterEncoding(..)方法设置相应的编码方式,只适用于post请求,也可以通过Servlet的Filter来进行中文编码方式的处理。%@pagelanguage=java%指定JSP的脚本语言,现在只能写java%@pageextends=..指定翻译后代码类型的父类,最好不要使用这个指令%@pagesession=true|false%指定是否自动创建Session,最好不自己指定,使用默认值%@pagebuffer=none|××KBautoflush=true|false%设置输出的缓存和是否自动刷新缓存,一般情况下都使用默认值,缓存的默认值为8KB。%@pageisThreadSafe=true|false%是否线程安全,默认为true,也就是线程安全,只使用默认值。%@pageinfo=..%设置页面信息,一般不用%@pageerrorPage=error.jsp%指定异常处理页面%@pageisErrorPage=true|false%设定本页面就是异常后跳转的页面%@pageisELIgnored=true|false%设定本页面是否忽略JSP2.0的EL表达式,该指令的默认值依赖于web.xml的版本。%@taglib..%标签库指令:用于引入自定义标签库JSP动作jsp:paramname=”paramName”value=”paramValue”/用来提供key/value信息,多用于jsp:include,jsp:forward,jsp:params元素中jsp:includepage=...flush=true|false/include动作是在翻译和编译后运行时进行响应的合并,也就是对应了Servlet中RequestDispatcher类的include(ServletRequestrequest,ServletResponseresponse)方法。include动作可以传递参数jsp:includepage=test.jspjsp:paramname=uservalue=/jsp:include在使用参数时,可以用request内置对象来获取参数的值。jsp:forwardpage=xxx/xxx.jspforward动作对应的是Servlet中RequestDispatcher类的forward(ServletRequestrequest,ServletResponseresponse)方法,也就是把请求进行转发。也可以写成jsp:forwardjsp:attributename=pagexxx/xxx.jsp/jsp:attribute/jsp:forward这种写法等价于上面的写法。也可以使用参数jsp:forwardpage=test.jspjsp:paramname=uservalue=/jsp:forward在使用Servlet的response的重定向sendRedirect(Stringlocation)方法在使用时要包含应用的路径,注意,重定向会放弃这个请求,并向服务器发送一个新的请求,但是响应对象还是一个。重定向是用来避免重复提交的。注意:对页面的刷新操作就会再一次运行程序,也就仿佛进行了再一次的提交一样,这也就是重复提交的问题,所以需要使用重定向来解决这个问题。jsp:plugintype=bean|appletcode=....../jsp:pluginjsp:plugin动作可以使页面上运行applet,或者是使用java代码。jsp:useBeanid=对象名class=类全名|type=类全名(使用多态时使用)beanName=类全名scope=page|request|session|applicationjsp:useBean动作,可以通过这个动作来使用java代码,id就是变量名,class和type的区别在于,使用type是不会创建对象的,而只是会先查找如果有该对象就会使用,如果没有就会抛出异常,class在没有该对象存在时,则会创建新对象。scope是用来保存实例的空间范围,page、request、session、application,由小到大,默认为page。jsp:setPropertyname=对象名property=属性名value=属性值/直接指定Bean属性的值,必须类型一致。jsp:setPropertyname=对象名property=属性名param=from表单中的响应的参数名/用表单中指定的参数来为Bean属性赋值,系统会自动作类型转换。jsp:setPropertyname=对象名property=属性名/用表单中和Bean属性同名的标单项来给Bean属性赋值,这样写只会为指定的属性赋值jsp:setPropername=对象名property=*/这种方式会自动用表单中的同名参数来为Bean的所有属性赋值jsp:setPropertyname=对象名property=属性名value=%=...%/使用表达式来为Bean的属性进行赋值jsp:getPropertyname=对象名property=属性名取得指定的属性,这个动作不常用,一般用表达式代替。我们可以通过设置属性名的方法名也就是setXxxx()来控制属性的赋值,用form表单的参数为Bean的属性赋值时,系统会自动的调用与之同名属性的setXxxx()方法,尤其是日期类型,可以通过使用这一方法来处理。例:importjava.sql.*;publicclassPerson{privateSrtingname;privateDatebirthday;publicvoidsetName(Stringname){this.name=name;}publicvoidsetBirthdayAsString(Stringbirthday){this.setBirthday(valueOf(birthday));}publicvoidsetBirthday(Datebirthdays){this.birthday=birthday;}}add.jspjsp:useBeanid=persontype=Personscope=requestjsp:setPropertyname=personproperty=*//jsp:useBeantoadd.jsp