Java Web笔记之JSP/JavaBean/Servlet+JSF

1、静态网站

2、jsp基础

直接在jsp中获取数据库中的内容:

2.1、db.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 = "";

%>

2.2、testdb.jsp

<
%@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);

   }

  %>

3、JSP+JavaBean架构

3.1、JSP与JavaBean结合实例

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属性值。

3.2、使用JavaBean的总结

在系统设计中

数据库层可以将数据库创建、查询、删除的代码抽象到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对象可否决此变化。

4、JSP+JavaBean+Servlet模式

4.1、Servlet过滤器和监听器【暂时没用处】

过滤器可用于全局页面设置、会话控制等

eg:web.xml&EncodingFilter.java;

监听器通常对用户某一时间触发监听,可增强java web程序的事件处理能力

eg:配置web.xml&编写CounterListener.java;

4.2、Servlet使用总结

4.2.1、在系统启动时Servlet会调用init()函数执行初始化,可用于动态读取配置参数

<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个参数;

4.2.2、同理在web.xml中配置LoginServlet.java类,映射地址为login.do

<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的对应关系】

5、JSP页面拓展开发技术EL、JSTL和Taglib

5.1、Expression Languege:数据访问语言,控制程序输出

只能用于jsp隐含对象中变量的输出,不能输出jsp中自定义变量。EL只是JSTL的一部分。格式:${expression},比如原jsp语句<%=pageSize%>可用EL表示为${requestScope.pageSize};

http://www.w3cschool.cc/jsp/jsp-expression-language.html

5.2、JSP Standard Tag Library:控制程序逻辑

要先到官网下载, 后导入standard.jar和jstl.jar(添加到WEB-INF\lib\目录下即可)。有多个标签库,其中核心标签库包括4类:通用标签、条件标签、迭代标签、URL标签;

5.3、自定义标签Taglib

与开发Servlet类似,需要使用JSP中某些API接口。教程(http://www.w3cschool.cc/jsp/jsp-custom-tags.html)讲的很清楚哇;

标签处理器接口的类关系图如下(http://blog.csdn.net/lijizh1013/article/details/8205333#t1):

Java Web笔记之JSP/JavaBean/Servlet+JSF_第1张图片

自定义标签开发流程:编写标签库描述符(tld)&标签处理类。

开发简单标签——继承SimpleTagSupport;属性标签——集成TagSupport;正文标签——集成BodyTagSupport;

【标签文件PagerTag.java真复杂,很凌乱】

6、JSF页面组建开发技术

JSF=JSP+JavaBean+Servlet+EL+JSTL+Taglib;是前述web技术框架集合;

6.1、JSF(JavaServer Faces)快速上手

同样要到官网下载,后导入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页面

6.2、JSF配置文件

两个基本元素<navigation>元素:用于配置导航规则;以及<managed-bean>元素:用于配置后台处理类ActionBean。

在使用ActionBean之前,要在<managed-bean>中进行配置,可以用<managed-property>指定初始值。数据类型包括:字符串型、ActionBean对象、List类型、Map类型。

6.3、JSF组件库

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的事件类型包括:动作事件、实时事件、阶段事件、值变事件;

你可能感兴趣的:(Java Web笔记之JSP/JavaBean/Servlet+JSF)