J2EE企业级开发学习笔记(8) JSP技术 1、JSP典型用法:处理以显示为中心的任务时使用JSP,处理逻辑时使用Servlet。在必须为客户端显示动态内容时,使用JSP非常合适。总之,JSP关注显示,而嵌入到JSP中的java代码则是用于与servlet或其他控制/数据进行实体通信。使用静态页面只需要一个简单的HTML页面来代替JSP页面。 2、模型1与模型2结构: 模型1:在构建简单的Web应用程序,该应用程序没有重要的处理需求时使用该模型。 模型2:遵从MVC模式,使用了一个或多个Servlet作为控制器,此外还使用了JavaBeans作为模型,JavaBeans作为控制器Servlet和JSP之间的通信工具。模型2更明显地隔离了显示和逻辑。当请求通常拒绝广泛的处理,防止导致变化多端的响应时使用该模型。 3、JSP:模板数据(静态部分HTML/XML)+JSP元素(动态部分:可通过JSP编译器和编译进Servlet)。 JSP元素:指令元素、动作元素、脚本元素 指令元素:<% include file="Header.jsp"%> 动作元素:<jsp:forward page="/errorPage"/> 脚本元素:把JSP中所有一切集中在一起,在请求处理过程中,可以用作定义变量、方法的声明或名称为scriptlets的代码块、及赋值表达式等。 声明:<%! Declaration %>,Declaration可以是变量和函数。如:<%! private static MyLoginCount=0; %> 表达式:Login Count:<%= result %>、<%=... %>相当于<jsp:>...</jsp:> Scriptlets:一种嵌入到JSP中的微型“脚本”代码。<% Java 代码 %>相当于<jsp:scriptlet>Java 代码</jsp:scriptlet> 【注意】JSP动作的7个指令: · jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。 · jsp:param: 用于传递参数,必须与其他支持参数的标签一起使用。 · jsp:include: 用于动态引入一个JSP 页面。 · jsp:p1ugin: 用于下载JavaBean 或Applet到客户端执行。 · jsp:useBean: 使用JavaBean 。 · jsp:setProperty: 修改JavaBean 实例的属性值。 · jsp:getProperty: 获取JavaBean 实例的属性值。 4、JSP隐式访问对象:request(请求)、response(响应)、pageContext(上下文)、session(会话)、application(应用)、out(输出)、config(配置)、page(页面=this)、exception(异常) 5、标记库:降低复杂性。为开发人员提供简单且易于使用的自定义标记,可以被用来调用复杂的逻辑。 标记库描述符:<%@ taglib uri="MyUtils-taglib.tld"> 6、JSP建模:<<ClientPage>>表示JSP在客户端的行为,即JSP外部可见的显示部分。客户页面与客户端资源有联系;<<ServerPage>>表示JSP在服务器端的行为,主要关注与处理请求和提供响应有联系的内部逻辑。服务器端页面与其他服务器资源有联系(外部系统、系统中数据库和控制器等) <<Build>>表示客户端页面与服务器端页面之间的关系。当服务器端页面创建了客户端页面时,产生的结果是发送到发出请求的浏览器HTML或XML流。 <<Include>>、<<Forward>>表示服务器页面与其他服务器页面之间的一种关联关系 <<Use Bean>>表示页面可能访问或使用JavaBeans <<Link>>表示客户端页面与其他客户端页面可能具有引入或输出的关系 <<Submit>>表示表单提交的输出关系 7、企业级应用中的JSP:
使用JavaBean技术的模型2结构: 上述银行交易系统的有关JSP顺序图:
ListTransacts.jsp使用与设置TransactInfo Bean关联的代码:
HttpSession session =request.getSession(true); //create bean to pass info to JSP page TransactInfo transactInfo=new TransactInfo(transacts); session.setAttribute("TransactInfo",transactInfo); ... //Forward to next JSP page RequestDispatcher dispatcher =GetServletContext().getRequestDispatcher("/ListTransacts.jsp"); dispatcher.forward(request,response);
8、与JavaBean相关的3个指令:useBean、setProperty、getProperty useBean语法格式:<jsp:useBean id="name" class="classname" scope="page|request|session|application"/> setProperty语法格式:<jsp:setProperty name="BeanName" property="propertyName" value="value"/> getProperty语法格式:<jsp:getProperty name="BeanName" property="propertyName"/> 9、plugin指令:主要用于下载服务器端的JavaBean 或Applet 到客户端执行。由于程序在客户端执行,因此客户端必须安装虚拟机。 plugin 的语法格式如下: <jsp:plugin type=bean | applet" code="classFileName" codebase="classFileDiretoryName" [name=" instanceName"] [archive="URLtoArchive"] talign= "bottom | top | middle | left | right"] [heigh="displayPixels"] [width="displayPixels"] [hspace="leftRightPixels"] [vspace="topBottomPiexels"] [jreversion=JREVersionNumber11.2"] [nspluginurl="URLToPlugin"] [iepluginurl="URLToPlugin"]> [<jsp:parames> [jsp:param name="parameterName" value="parameterValue"I>] </jsp:params>] [<jsp:fallback>text message for user that can no see the plugin </jsp:fallback> ] </jsp:plugin> 10、application使用context-param元素配置,并从web.xml 文件中获取参数。在web.xml文件中增加如下片段: <!-- 配置第一个参数: driver--> <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <!一配置第二个参数: url--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/j2ee</param-value> </context-param> <!一配置第三个参数: user--> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> <!一配置第四个参数: pass--> <context-param> <param-name>pass</param-name> <param-value>32l47</param-value> </context-param> ================================= //从配置参数中获取驱动 String driver = application. getInitParameter ("driver") ; //从配置参数中获取数据库url String url = application.getInitParameter("url"); II从配置参数中获取用户名 String user = application.getInitParameter("user"); //从配置参数中获取密码 String pass = application.getInitParameter("pass"); //注册驱动 Class.forName(driver); //获取数据库连接 Connection conn = DriverManager.getConnection(url , user , pass); //创建Statement 对象 Statement stmt = conn.createStatement(); //执行查询 ResultSet rs = stmt.executeQuery("select * from userinf"); ... 通过这种方式,可以将一些配直信息放在web.xml 文件中配直,避免使用硬编码方式写在代码中,从而更好地提高程序解耦。 11、pageContext属性生存范围: pageContext.getAttributesScope("page"); //page=1 pageContext.getAttributesScope("request");//request=2 pageContext.getAttributesScope("session");//session=3 pageContext.getAttributesScope("application");//session=4 12、request内置对象3种用途:封装表单域值(request.getParameter(s)("name"))、封装地址栏参数(地址栏传递参数的格式是urI?paraml=va1ue1&p缸am2=value2&…)、封装请求的属性(request.setAttribute(String attName,Object attValue)\getAttribute(String attName)) 13、response内置对象3种用途:可以响应生成图片,而out无法做到;重定向请求;向客户端增加Cookie 【注意】重定向(response.sendRedirect("forward-result.jsp"))会丢失所有的请求参数,使用重定向的效果,与在地址栏里重新输入新地址再回车的效果完全一样。 客户端增加Cookie三部曲:创建Cookie实例(Cookie cookie =new Cookie("username",name))-> 设置Cookie生命期限(cookie.setMaxAge(24*3600);//表示一天) -> 向客户端增加Cookie对象以一定期限保存客户信息(response.addCookie(cookie)) 访问Cookies[]:request.getCookies();然后遍历Cookies数组(for(Cookie c:Cookies){c.getName()}) 【注意】使
|