JAVA EE JSP_JSTL

JSP2.1的改动
http://marshal.iteye.com/blog/141878
带着这个问题,查看了JCP的change log。
见: jcp.org/aboutJava/communityprocess/maintenance/jsr245/245-MR1.html  
JSP2.1主要改动是,使EL可脱离JSP2.1规范并单独成为规范。
下一个版本的JSP规范将删除有关EL的描述。
并将推出单独的EL规范。
改动列表:
  1. 版本:作为JSP2.1一部分的EL定义为1.0,独立的EL定义为1.1。
  2. 在EL1.1中的新方法:为了EL可以独立执行,增加了两个工厂方法。
    • javax.el.ExpressionFactory.newInstance()
    • javax.el.ExpressionFactory.newInstance(Properties)

 

JSP 2.1   Tag Libs  / JSTL 1.2 ... + tomcat6        

http://hintcnuie.iteye.com/blog/178038

http://jakarta.apache.org/taglibs/doc/standard-1.0-doc/intro.html

JSP 2.0 Tag Libs   RDC / Standard-1.1 

JSP 1.2 Tag Libs  Standard-1.0

JSP 1.1 Tag Libs   DateTime / I18N / JNDI / Log / Random / Regexp / String

http://aguu125.blogbus.com/logs/32255197.html

JSTL 1.2   (J2EE 5/JSP 2.1) + tomcat6

Download: https://maven-repository.dev.java.net/repository/jstl/jars/ 

JSTL 1.1   (J2EE 1.4/JSP 2.0)

Download: http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

 

JSTL 1.0   (J2EE 1.3/JSP 1.2)

Download: http://jakarta.apache.org/site/downloads/downloads_taglibs-standard-1.0.cgi

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>

http://user.qzone.qq.com/170475387/blog/50

JSP API

http://tomcat.apache.org/tomcat-5.5-doc/jspapi/index.html

Jasper API

http://tomcat.apache.org/tomcat-5.5-doc/jasper/docs/api/index.html  
Servlet API  
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html  
http://jakarta.apache.org/taglibs/index.html  
http://archive.apache.org/dist/jakarta/taglibs/standard/  
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/  
http://archive.apache.org/dist/jakarta/taglibs/standard/source/  

 

JSP 2.0 技术手册.pdf

http://leishih.iteye.com/blog/131123

http://lib.verycd.com/2008/03/28/0000184299.html

JSP 2.0 Tag Libs      
RDC  Tag libs  Reusable Dialog Components  
Standard-1.1   http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi  
JSP 1.2 Tag Libs   Standard-1.0  
JSP 1.1 Tag Libs   DateTime   I18N   JNDI   Log   Random   Regexp   String  
JSP 1.0 Tag Libs   core   、 format 、 xml 、 sql  
core  
表达式操作:out、set、remove、catche 
流程控制:if、choose、when、otherwise 
迭代操作:forEach、forTokens 
URL操作:import param、url param、redirect param 


session与cookie的区别  
http://blog.csdn.net/ddviplinux/archive/2008/04/17/2299441.aspx

利用session实现在线人员监控

http://tcrct.iteye.com/blog/259173

JSP防止吃重复在线人数统计

http://xiaozhao-521.iteye.com/blog/263420


scope   :page、request、session、application 
page<request<session<application 
session默认时效:  
Tomcat
〉〉〉〉〉〉  
config文件夹web.xml文件   
          <session-config>   
                  <session-timeout>30</session-timeout>   
          </session-config>   
Tomcat
〉〉〉〉〉〉  
Expression Language   隐式对象   11个   :JSP、scope、param、header、Cookie、initParam。      
JSP            PageContext 
作用域       pageScope、requestScope、sessionScope、applicationScope 
请求参数    param、paramValues 
请求头       header、headerValues 
Cookie      cookie 
初始参数    initParam 
JSP  隐式对象   9个   :   request、response、out、session、appliation、pageContext、page、config、exception  
输入输出对象::request、response、out 
作用域通信对象:session、appliation、pageContext 
Servlet对象:::page、config 
错误对象::::exception       
scriptlet 
<% if (user.getRole() == "member")) { %> 
    <p>Welcome, member!</p> 
<% } else { %> 
    <p>Welcome, guest!</p> 
<% } %> 
jsp  
<jsp:setProperty name="user" property="timezonePref" value='<%= request.getParameter("timezone") %>'/> 
jsp+el  
<c:out value="Hello ${user.firstName} ${user.lastName}"/> 
el算术运算符  
${item.price * (1 + taxRate[user.address.zipcode])} 
el关系和逻辑运算符  
${(x >= min) && (x <= max)} 
el版本Taglib伪指令  
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> 
rt版本Taglib伪指令  
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %> 
<c:set>  
<c:set var="
name   " scope="s cope   " value=" expression   "/> 
<c:set var="timezone" scope="session">CST</c:set> 
<c:set var="square" value="${param['x'] * param['x']}"/> 
<c:remove>  
<c:remove var="timezone" scope="session"/> 
<c:out>  
<c:out value="
expression   " default=" expression   " escapeXml=" boolean   "/> 
带缺省值:Hello <c:out value="${user.username}" default=="Guest"/>! 
禁用转义:<c:out value="${user.company}" escapeXml=="false"/> 
<c:set><c:out/></c:set>  
<c:set var="timezone" scope=="session"><c:out value="${cookie['tzPref'].value}" default=="CST"/></c:set> 

通过避免使用脚本编制元素来简化对 JSP 应用程序的软件维护 
developerWorks 中国     >     Java technology  
http://trampeagle.iteye.com/blog/23492  
http://www.ibm.com/developerworks/cn/java/j-jstl0211/  
JSTL Core使用定制标记进行流控制和 URL 管理 
developerWorks 中国     >     Java technology   Web development     >    
http://www.ibm.com/developerworks/cn/java/j-jstl0318/  
JSP语法:<% =userList.getUser().getPhoneNumber() %> 
JSP+JSTL:<c_rt:out value="<% =userList.getUser().getPhoneNumber() %>" /> 
JSTL+EL:<c:out value="${userList.user.phoneNumber}" /> 
1。jsp有哪些动作?(6种)作用分别是什么?  
jsp:include           在页面被请求的时候引入一个文件。 
jsp:useBean          寻找或者实例化已个JavaBean。 
jsp:setPropetry      设置JavaBean的属性。 
jsp:getProprtry      输出某个JavaBean的属性。 
jsp:forward         把请求转到一个新页面。 
jsp:plugin           根据浏览器类型为java插件生成Object或embed标记。   
2。jsp include中实现两种方式的区别?  
动态和静态两种 
动态include:用jsp:include动作实现,它总会检查所含文件的变化,适合于包含动态页面,并且可以带参数。 
静态include:用include伪码事项,定不会检查文件的变化,适用于包含静态页面。 

4. Forword 和Redirect 的区别  
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来, 
然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的, 
所以它的地址栏中还是原来的地址。 
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址, 
一般来说浏览器会用刚才请求的所有参数重新请求, 
所以session,request参数都可以获取。 
http://www.gzit.org/html/27/27-1641.html  
含参请求转发  
<jsp:forward page="Relative URL">  
作用与SERVLET中使用的RequestDispatcher方法的作用是一致 
由服务器执行,因此跳转的页面可以放在WEB-INF目录中,提高程序的安全性 
服务器重定向  
response.sendRedirect()  
向浏览器发送一个特殊的HEADER,然后又浏览器来做转向,装到指定的页面 
浏览器上的地址栏里可以明显看到地址的变化,使用sendRedirect做转向时,转向的页面不能放在WEB-INF下 
页面级重定向  
<meta http-equiv="Refresh" content="秒数";url="跳转的文件或者地址">  
重定向   请求作用域的参数在转到下一页面时回失效 
还有就是用js了...  
windows.location.href='www.gzit.com'  
windows.navigate('www.gzit.com') 
windows.location.replace('www.gzzit.com')


Servlet

Servlet的Filter过滤器 http://gotothework.iteye.com/blog/226204


过滤器是请求和响应之间的一种WEB组件,它驻留在服务器端,用来截取客户端与资源之间的请求,并对这些信息进行“过滤”。 

Servlet容器对部署描述符中声明的每一个过滤器只会创建一个实例。与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此开发过滤器时要注意线程安全问题。 

当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联,如果有那么容器将把请求交给过滤器进行处理,在过滤器中可以改变 请求的内容,或重新设置请求的报头信息,然后将请求发送给目标资源,当目标资源对请求做出响应时,容器同样会将响应转发给过滤器,在过滤器中可以对响应的 内容进行过滤,从上面的过程我们可以看出,客户端和目标资源不需要知道过滤器的存在,对于客户端来说是透明的。 

过滤器位于javax.servlet包中,有3个主要方法: 
1.init(FilterConfig config) 
Web容器调用方法来初始化过滤器,容器在调用该方法时,向过滤器传递FilterConfig对象,FilterConfig用法和 ServletConfig类似。利用FilterConfig对象可以得到ServletContext对象,以及在部署描述符中配置的过滤器的初始化 参数。 

2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 
doFilter()方法类似Servlet接口的service()方法。当客户端请求目标资源的时候,容器会调用与这个目标资源想关联的过滤器的 doFilter()方法。在这个方法中,可以对请求和响应进行处理,实现过滤器的功能。在特定的操作完成后,可以调用chain.doFilter() 方法将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或利用RequestDispatcher的forward()和 include()方法,以及sendRedirect()方法转发。 
但是要注意,这个方法的请求响应参数的类型是ServletRequest和ServletResponse,也就是说过滤器的使用不依赖具体的协议。 

3.destroy() 
Web容器调用该方法只是过滤器的声明周期结束。 

下面看下过滤器在Web.xml中的声明:

Java代码  复制代码
  1. <filter>  
  2.     <filter-name>setEncoding</filter-name>  
  3.     <filter- class   >com.test.CharFilter</filter-   class   >  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>setEncoding</filter-name>  
  7.     <url-pattern>/*</url-pattern>  
  8. </filter-mapping>  
<filter> <filter-name>setEncoding</filter-name> <filter-class>com.test.CharFilter</filter-class> </filter> <filter-mapping> <filter-name>setEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 



Filter的声明和Servlet的类似,从上面的简单的配置中就可以看到,不做过多说明,主要说下<url-pattern>元素中的参数: 
1.REQUEST,当用户直接访问页面时,Web容器将会调用过滤器,如果目标资源是通过RequestDispatcher的includ()或forward()方法访问时,那么不会调用这个过滤器。 
2.FORWARD,如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外过滤器不会被调用。 
3.INCLUDE,如果目标资源是通过RequestDispatcher的include()方法访问时,调用过滤器,其他不会调用。 
4.ERROR,如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用,除此之外不会被调用。 
5./*,所有请求都会调用。 

过滤器应用的很广,特别是在Spring中,AOP,Acegi都应用到了过滤器的技术,所以,我们可以看出,只有很好的掌握了Servlet的 各种技术,我们在后期的学习中才能更加的得心应手。在这里,我只是简单的介绍了过滤器基础的东西,更加高级的,希望与大家一起学习讨论。





export excel csv.jsp
<%@ page language="java" import="java.io.*,java.sql.*" pageEncoding="UTF-8"%>
<jsp:directive.page import="com.arvato.sn.common.Common;"/>
<%
 response = (HttpServletResponse) pageContext.getResponse();
 response.setContentType("text/plain");
 response.addHeader("content-disposition","attachment; filename=productList.csv");
 response.setContentType("application/vnd.ms-excel; charset=GBK");
 //com.bstek.dorado.data.Dataset ds = new com.arvato.sn.product.view.ProductListViewModel().getDataset();
 PrintWriter pw = response.getWriter();
 Connection con = Common.getInstrage().getCon();
 Statement st = con.createStatement();
 ResultSet rs = null;
 String comma = ",";
 StringBuffer sb = new StringBuffer();
 sb = sb.append("SELECT ");
 sb.append("GENERAL_PRODUCT.NAME 品名,");
 sb.append("trunc(PRODUCT_LIST.ERP_CODE) 商品代码,");
 sb.append("SALES_ORGANIZATION.SALES_ORGAN_NAME 分公司,");
 sb.append("PRODUCT_LIST.SALES_ORG 分公司代码,");
 sb.append("PRODUCT_LIST.VENDOR 供应商代码,");
 sb.append("PRODUCT_LIST.DISTRIBUTION_SITE 发货地点,");
 sb.append("PRODUCT_LIST.DEPOT 库位,");
 sb.append("B2C_CATEGORY.NAME b2c类别,");
 sb.append("PRODUCT_LIST.SALE_QUANTITY 销售数量,");
 sb.append("SHADOW_INVENTORY.STOCK_QUANTITY 库存,");
 sb.append("PRODUCT_LIST.REF_PRICE 最近销售价格,");
 sb.append("PRODUCT_LIST.FORWARD_STATUS 厂送标志,");
 sb.append("PRODUCT_LIST.EAN_CODE EAN码,");
 sb.append("to_char(PRODUCT_LIST.LATEST_SALE_DATE,'yyyy-MM-dd') 最后销售日期 ");
 sb.append("FROM PRODUCT_LIST,");
 sb.append("SALES_ORGANIZATION SALES_ORGANIZATION,");
 sb.append("GENERAL_PRODUCT GENERAL_PRODUCT,");
 sb.append("B2C_SAP B2C_SAP,");
 sb.append("B2C_CATEGORY B2C_CATEGORY,");
 sb.append("VENDOR VENDOR,");
 sb.append("SHADOW_INVENTORY SHADOW_INVENTORY ");
 sb.append("WHERE");
 sb.append("(PRODUCT_LIST.SALES_ORG = SALES_ORGANIZATION.SALES_ORGA_CODE(+)) AND ");
 sb.append("(PRODUCT_LIST.FK_GENERAL_PRODUCT = GENERAL_PRODUCT.GENERALID(+)) AND ");
 sb.append("(GENERAL_PRODUCT.FK_SAP_CATEGORY = B2C_SAP.FK_SAP_CATEGORY(+)) AND ");
 sb.append("(B2C_SAP.FK_B2C_CATEGORY = B2C_CATEGORY.BCATEGORYID(+)) AND ");
 sb.append("(PRODUCT_LIST.VENDOR = VENDOR.VENDOR_CODE(+)) AND ");
 sb.append("(PRODUCT_LIST.ERP_CODE = SHADOW_INVENTORY.ERP_CODE(+)) AND ");
 sb.append("(PRODUCT_LIST.VENDOR = SHADOW_INVENTORY.VENDOR(+)) AND ");
 sb.append("(PRODUCT_LIST.DISTRIBUTION_SITE = SHADOW_INVENTORY.DISTRIBUTION_SITE(+)) AND ");
 sb.append("(PRODUCT_LIST.DEPOT = SHADOW_INVENTORY.DEPOT(+))");
 //String so = request.getParameter("SALES_ORG");
 //String code = request.getParameter("ERP_CODE");
 //String pname = request.getParameter("NAME");
 //if(so!=null){
  //sb.append(" AND PRODUCT_LIST.SALES_ORG ='").append(so).append("'");
 //}
 //if(code !=null && code.trim()!=""){
  //sb.append(" AND PRODUCT_LIST.ERP_CODE like '%").append(code).append("%'");
 //}
 //if(pname !=null){
  //sb.append(" AND GENERAL_PRODUCT.NAME like '%").append(pname).append("%'");
 //}
 String sql = sb.toString();
 System.out.println(sql);
 rs = st.executeQuery(sql);
 if(rs!=null){
 String erpCode = "";
 String name = "";
 String salesName = "";
 String salesOrg = "";
 String vendor = "";
 String ds = "";
 String dept = "";
 String b2cCate = "";
 int qty = 0;
 int stock = 0;
 int price = 0;
 String fs = "";
 String ean = "";
 String salesDate = "";
 //to write the title
 pw.write("品名"+comma+"商品代码"+comma+"分公司"+comma+"分公司代码"+comma+"供应商代码"+comma+"发货地点"+comma+"库位"
 +comma+"b2c类别"+comma+"销售数量"+comma+"库存"+comma+"最近销售价格"+comma+"厂送标志"+comma+"EAN码"+comma+"最后销售日期"+"\n");
 while(rs.next()){
  name = rs.getString(1);
  erpCode = rs.getString(2);
  salesName = rs.getString(3);
  salesOrg = rs.getString(4);
  vendor = rs.getString(5);
  ds = rs.getString(6);
  dept = rs.getString(7);
  b2cCate = rs.getString(8)== null?"":rs.getString(8);
  qty = rs.getInt(9);
  stock = rs.getInt(10);
  price = rs.getInt(11);
  fs = rs.getString(12) == null ? "":rs.getString(12);
  ean = rs.getString(13);
  salesDate = rs.getString(14);
  pw.write(name+comma+erpCode+comma+salesName+comma+salesOrg+comma+vendor+comma+ds+
  comma+dept+comma+b2cCate+comma+qty+comma+stock+comma+price+comma+fs+comma+ean+comma+salesDate);
  pw.write("\n");
 }
 rs.close();
 con.close();
 }
 %>



JSP中表单数据存储的一种通用方法
******************** JSP中表单数据存储的一种通用方法   *********** 
摘 要 
  本文以Oracle数据库为例,介绍了在采用JSP技术开发WEB应用时一种简便通用的表单数据存储处理方法,以减轻开发工作量,同时提供了主要的程序代码。 
  引言 
  J2EE(Java 2 Enterprise Edition)技术已广泛应用在Web应用开发中,其中的JavaBean、Servlet技术为开发者提供了更为清晰的开发环境,使用JSP技术表现 页面,使用Servlet技术完成大量的业务处理,使用Bean来存储数据及一些业务处理。在WEB应用中,业务数据存储到数据库中的处理工作经常很繁 重,其中一种主要的形式就是表单数据存储到数据库,整个应用处理过程牵涉到大量的这种数据存储操作,对每个表单都要单独编写相应的数据存储程序,花费了开 发人员大量的时间和精力。采用什么方法来减轻表单数据存储的开发工作量是值得研究的问题。 
  两种常见的表单数据存储处理方法 
  1、对每一表单都编写相应的程序代码 
  在JSP页面或JavaBean或Servlet中,使用request. getparameter()函数逐一提取表单提交的数据,或编写相应的JavaBean,使用setProperty方法将数据自动取到 JavaBean中,然后生成SQL语句(insert,update,delete),最后执行executeupdate()函数完成数据表存储。 
  2、对每一数据表自动生成一个JavaBean程序代码 
  数据库系统必须支持用户能够读取表结构,并识别关键字段。利用面向对象快速开发工具,如PowerBuilder、Delphi等,自行开发 一个java代码自动生成程序。在该程序中读取数据库表的结构:字段名、数据类型、数据长度,自动生成一个JavaBean代码。在该代码中定义与表中字 段对应的同名变量,建立所有变量的setValue和getValue方法,建立insert、update、delete函数分别处理insert、 update、delete的SQL语句生成和执行。 
  在表单提交的数据处理页面中,编写如下代码,将表单数据存储到JavaBean中: 
<jsp:useBean id="table" class="table1_bean" /> 
<jsp:setProperty name="table" property="*" /> 
(注:table1_bean为上述自动生成的对应某一个表的JavaBean) 
然后调用table1_bean中insert、update、delete函数完成数据表存储,并返回执行结果。如: 
<%boolean success =table.insert(); %> 
  第一种方法简单直观,但对每一表单都需要编写相应的数据处理程序。对稍微大一点的应用,表单数量可能很多,开发工作量很大,开发工作效率低。表结构变动如增加、减少字段时,需修改相应的数据处理程序。 
  第二种方法相对第一种简便得多,每一数据表的数据处理由对应的JavaBean实现,JavaBean自动生成,不需编写,表结构变动时只需 重新生成新的JavaBean,经java编译后覆盖原java类即可。但该方法需要开发JavaBean自动生成程序,表结构变动时JavaBean需 要重新生成和编译。 
  介绍一种简便通用的方法实现表单数据存储 
  在WEB应用开发中,很多表单在经过前台浏览器端简单的数据校验后,提交后台服务器,服务器对数据不用作任何处理直接将数据存储到一个数据表 中。对这种情况,我们可以只编写一个程序,对这些表单统一处理,将数据存储到相应的一个数据表中。该方法同样要求数据库系统支持表结构读取和关键字段识 别。我们采用JSP技术编写该程序,程序文件取名为DbdataStore.jsp。 
  1、调用格式 
  在网页中表单的Action调用方法如下: 
<Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…"> 
  table1为数据将要存储的数据库表的表名,OperType操作类型分为三种:insert,update,delete。 
表单中的<input type=text name=…>,<textarea name=…><select name=…>等中的name值应与数据表的字段名相同,DBdataStore.jsp中逐一提取表单提交的对应字段名的数据值,若表单中未定义输入, 得到的值为空值,则对该字段不作处理。 
  2、以oracle为例的视图定义 
  1) 建立表各列数据类型视图 
CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name,column_name,data_type,data_length,data_precision,data_scale,column_id


 

E:\program\JSP+Servlet+JSF\11(进阶一)_JSP+JDBC实现

 

 

/*
E:\program\JSP+Servlet+JSF\11(进阶一)_JSP+JDBC实现>tree /f
卷 data 的文件夹 PATH 列表
卷序列号码为 0044004A E462:C3F5
E:.
│  JSP+JDBC留言管理程序-cl.avi
│  笔记.pdf
│  简介.txt
│
└─代码
    └─note
            delete_do.jsp
            insert.jsp
            insert_do.jsp
            list_notes.jsp
            list_notes.jsp.bak
            login.jsp
            login_conf.jsp
            login_success.jsp
            update.jsp
            update_do.jsp
            数据库创建脚本.txt
*/
--删除表
DROP TABLE person;
DROP TABLE note;
--删除序列
DROP SEQUENCE note_seq;
--创建表
CREATE TABLE person(
       id varchar(20) not null primary key,
       name varchar(20),
       password varchar(20)
);

CREATE TABLE note(
       id int not null primary key,--sequence
       title varchar(20) not null,
       author varchar(20) not null,
       content varchar(50) not null
);
--插入数据
INSERT INTO person VALUES('txj','唐修进','tttttt');
INSERT INTO person VALUES('lindows','唐修进','llllll');
--提交事务
commit;
 

 

el 表达式

 

mytag extends BodyTagSupport   //JSP API

doStartTag();

--EVAL_BODY_INCLUDE 只输出标签体内容

--EVAL_BODY_BUFFER   计算标签体内容或处理

--SKIP_BODY_INCLUDE  忽略标签体内容

doEndTag();

--SKIP_PAGE 并输出标签后内容

--EVAL_PAGE 输出标签后内容

tagsupport与bodytagsupport的区别

http://mercyblitz.iteye.com/blog/70114

http://nenty.iteye.com/blog/261951

JSP自定义标签学习(高级)

http://www.cnzzad.com/tut/47843.html

 

JSP自定义标签学习之高级标签

http://www.eimhe.com/bbs/viewthread.php?tid=91949&extra=page%3D1

 

 

 

JSP 购物车 

1.session 放入服务器内存

2.隐藏表单域:request.setAttribute();//来回传输耗资源

 

 

end

 

 

 

你可能感兴趣的:(java,tomcat,应用服务器,jsp,servlet)