直接在jsp中获取数据库中的内容:
<%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.Statement"%> <%@ page import="java.sql.ResultSet"%> <%@ page import="java.sql.ResultSetMetaData"%> <% String drv = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/demo"; String usr = "root"; String pwd = ""; %>
< %@page language="java" contentType="text/html;charset=gb2312"%> <%@ include file="db.jsp"%> <%String sql = "select * from user"; try { Class.forName(drv).newInstance(); Connection conn = DriverManager.getConnection(url, usr, pwd); Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData();// int cols = rsmd.getColumnCount();//列数? while (rs.next()) { for (int i = 1; i <= cols; i++) { String field = (String) (rsmd.getColumnName(i)); String value = (String) (rs.getString(i)); out.print(field + "=" + value + ";"); } out.println(); } rs.close(); stm.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); out.println(e); } %>
counter.java
package org.jason; public class counter { int count=0; String name=null; //计数操作,每一次请求count加1 public int getCount(){ count++; return this.count; } public void setCount(int count){ this.count=count; } }
counter.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd "> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <jsp:useBean id="bean0" scope="application" class="org.jason.counter"></jsp:useBean> <%out.println("this counter is:"+bean0.getCount()+"<BR>");%> </body> </html>
所以jsp调用JavaBean方法需要先使用<jsp:useBean>创建JavaBean对象书签;
接着直接使用代码获得属性值 or 使用<jsp:getProperty>标签得到count属性值。
在系统设计中
数据库层可以将数据库创建、查询、删除的代码抽象到JavaBean中,再使用JSP调用JavaBean,以降低代码重复提高系统重用性;
业务层可以抽取JavaBean类来进行业务操作。(比如登录、注册等等)
在action/login.jsp中调用JavaBean
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import="com.demo.javabean.UserBean"%> <% //取得参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 验证登录 UserBean userBean = new UserBean(); boolean isValid = userBean.valid(username, password); if (isValid) { session.setAttribute("username", username); response.sendRedirect("../welcome.jsp"); } else { response.sendRedirect("../login.jsp"); } %>
类似的其他功能也可以抽象到JavaBean中,方便使用。【在jsp中通过三个标准标签来调用JavaBean好像不常用】
Mark1:在Eclipse的Java编辑器窗口右键>source>generate getters and setters便可以直接生成getter和setter方法。
Mark2:更新sql函数update()
public boolean update(String sql){ boolean b=false; try{ stm=conn.createStatement(); stm.execute(sql); b=true; }catch(Exception e){ } return b; }
Mark3:在JavaBean的设计中,按照属性的不同作用分为4类:
simple属性:简单属性,伴随get/set方法;
indexed属性:表一个数组值,可通过对应get/set方法取得数组中数值或者一次设置整个数组的值;
bound属性:当该种属性变化时,激活一个PropertyChange事件(封装了属性名、原值、新值);
constrained属性:该属性变化时,与该属性建立了某种连接的其他java对象可否决此变化。
过滤器可用于全局页面设置、会话控制等
eg:web.xml&EncodingFilter.java;
监听器通常对用户某一时间触发监听,可增强java web程序的事件处理能力
eg:配置web.xml&编写CounterListener.java;
<servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>com.demo.servlet.InitServlet</servlet-class> <init-param> <param-name>drv</param-name> <param-value>org.gjt.mm.mysql.Driver</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/demo</param-value> </init-param> <init-param> <param-name>usr</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>pwd</param-name> <param-value>123</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
接着在InitServlet.java使用getInitParameter()即可取得数据库连接的4个参数;
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.demo.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
这个根目录下事件处理不必在跳到action下响应文件,直接交给Servlet即可
<form name="form1" action="login.do" method="post" onsubmit="return validLogin(this);">
用户登录类LoginServlet.java
package com.demo.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.demo.javabean.UserBean; public class LoginServlet extends HttpServlet { public final static long serialVersionUID = 0; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); // 取得参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 验证登录 UserBean userBean = new UserBean(); boolean isValid = userBean.valid(username, password); if (isValid) { session.setAttribute("username", username); response.sendRedirect("welcome.jsp"); } else { response.sendRedirect("login.jsp"); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
Mark1、本模式优点:将所有用户请求都提交给了Servlet来处理,而不是由JSP页面来处理,这使得代码分层和任务处理更加清晰。
JSP负责页面表单和数据显示;
Servlet负责表单请求和数据处理;
JavaBean负责数据层业务处理;
基于Struts、Spring等的MVC框架也是基于以上分工的。
【servlet在MVC架构中起到了控制中心的作用。Servlet用来分发和处理来自客户端浏览器的请求,通过web.xml可以找到用户请求和特定Servlet的对应关系】
只能用于jsp隐含对象中变量的输出,不能输出jsp中自定义变量。EL只是JSTL的一部分。格式:${expression},比如原jsp语句<%=pageSize%>可用EL表示为${requestScope.pageSize};
http://www.w3cschool.cc/jsp/jsp-expression-language.html
要先到官网下载, 后导入standard.jar和jstl.jar(添加到WEB-INF\lib\目录下即可)。有多个标签库,其中核心标签库包括4类:通用标签、条件标签、迭代标签、URL标签;
与开发Servlet类似,需要使用JSP中某些API接口。教程(http://www.w3cschool.cc/jsp/jsp-custom-tags.html)讲的很清楚哇;
标签处理器接口的类关系图如下(http://blog.csdn.net/lijizh1013/article/details/8205333#t1):
自定义标签开发流程:编写标签库描述符(tld)&标签处理类。
开发简单标签——继承SimpleTagSupport;属性标签——集成TagSupport;正文标签——集成BodyTagSupport;
【标签文件PagerTag.java真复杂,很凌乱】
JSF=JSP+JavaBean+Servlet+EL+JSTL+Taglib;是前述web技术框架集合;
同样要到官网下载,后导入jsf-api.jar和jsf-impl.jar;
web.xml中
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping>
url-pattern决定了所有JSF页面的后缀名。
JSF应用开发过程:
开发JSP页面>开发ActionBean类>配置文件faces-config.xml>部署web.xml;
faces-config.xml中
<navigation-rule> <from-view-id>/hello.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/hellopage.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>helloAction</managed-bean-name> <managed-bean-class>com.demo.jsf.HelloAction</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
<managed-bean>中统一管理ActionBean,指定名字、类全名和存活范围。
所用JSF页面都是由特定的servlet处理,该servlet是JSF实现代码的一部分。要确保在请求JSF页面时激活正确的servlet,JSF URL使用特殊的格式。在该文件中都有一个扩展名为.faces。例如,不能将浏览器指向http://localhost:8080/JSF/index.jsp,URL应该是http://localhost:8080/JSF/index.faces. servlet使用映射规则来激活JSF servlet,它去除了faces的后缀并加载index.jsp页面。
两个基本元素<navigation>元素:用于配置导航规则;以及<managed-bean>元素:用于配置后台处理类ActionBean。
在使用ActionBean之前,要在<managed-bean>中进行配置,可以用<managed-property>指定初始值。数据类型包括:字符串型、ActionBean对象、List类型、Map类型。
JSF标签包括JSF组件库:主要是页面的HTML组件显示标签,以<h>开头。以及JSF核心库:主要用于页面格式化输出、数据校验、国际化,以<f>开头。
在jsp中使用JSF EL语言、HTML标签和数据处理;
在使用JSF的HTML标签库之前,需要在页面添加如下引用:
<%@ taglib uri=http://java.sun.com/js/core prefix="f" %>
<%@ taglib uri=http://java.sun.com/js/html prefix="h"%>
在Eclipse中光标置于标签代码,按“alt+/”即可打开选择列表,基本标签分为5大类:
输出类(以output开头)、输入类(以input开头)、命令类(以command开头)、选择类(以select开头)、表格类;
【考虑到标签较多,参考“在JSF2中使用编辑器ck-jsf-editor(http://my.oschina.net/chen7/blog/160055)”】
运行后JSF的HTML标签会转化为普通html标签。
JSF的事件类型包括:动作事件、实时事件、阶段事件、值变事件;