Java Web開發模式

一 Java Web開發模式的變遷css

1 最初的Java web服務器端編程技術是Servlet,利用Servlet就能夠開發出一個Web應用程序。html

2 爲了解決Servlet缺陷,SUN推出了JSP技術。可是開發人員又走向了另外一個極端就是徹底放棄了Servlet。java

  在JSP頁面混合使用HTML標記和java代碼編寫的腳本元素標記來開發Web程序。採用這種方法雖然能夠編寫JSP頁面變得簡單,直觀,然而,他只適合於業務流程簡單,系統規模較小的應用系統。mysql

  若是系統較大的話,就會出現兩個嚴重的缺點:web

   1) 頁面嚴重缺少可讀性。sql

   2) 沒有將頁面表現和業務邏輯實現分開,使維護難度增長了。數據庫

在JSP中使用JavaBean能夠實現頁面與邏輯業務分開。編程

3 SUN公司將在Web應用開發中使用JSP+JavaBean技術。===JSP模式1   (適用於規模較小,業務邏輯簡單的web應用開發)。設計模式

4 SUN在java web開發中引入了MVC架構模式,利用Servlet,JSP,JavaBean技術(講servlet做爲MVC架構模式中的控制器,JSP做爲視圖,javabean做爲模型)===JSP模式2()這也不是絕對完美的。服務器

二 在JSP中使用JavaBean

    一個標準的JavaBean組件具備如下幾個特徵

 1 package com.cy.bean;
 2 
 3 import java.io.Serializable;
 4 
 5 /*JavaBean 類必須是一個公共類,並將其訪問屬性設置爲 public。*/
 6 /*JavaBean應該是可序列化(serializable)的,即實現java.io.Serializable 接口  */
 7 
 8 public class User implements Serializable {
 9     private static final long serialVersionUID = 1L;
10     /* 一個JavaBean類不該有公共實例變量,類變量都爲private */
11     private int id;
12     private String name;
13     private String pwd;
14     private int postion;
15 
16     /* JavaBean 類必須有一個空的構造函數,(系統會默認一個無參構造器,若是沒有其餘的構造器) */
17     public User() {
18         super();
19     }
20 
21     /* 要訪問這些類變量,應該經過一組存取方法(getXxx 和 setXxx)來訪問, */
22     public int getId() {
23         return id;
24     }
25 
26     public void setId(int id) {
27         this.id = id;
28     }
29 
30     public String getName() {
31         return name;
32     }
33 
34     public void setName(String name) {
35         this.name = name;
36     }
37 
38     public String getPwd() {
39         return pwd;
40     }
41 
42     public void setPwd(String pwd) {
43         this.pwd = pwd;
44     }
45 
46     public int getPostion() {
47         return postion;
48     }
49 
50     public void setPostion(int postion) {
51         this.postion = postion;
52     }
53 
54 }

爲了在JSP頁面中使用JavaBean,SUN在JSP規範中提供了三種標準動做。

1 <jsp:useBean>動做   獲得或者建立一個JavaBean對象 
 語法形式:

<jsp:useBean id=「beanName」 //變量名 scope=「page|request|session|application」 //做用範圍  class=「className」  //類全路徑/>

1  <jsp:useBean id="user" class="com.cy.bean.User" scope="request"></jsp:useBean>

 

id:表明bean的引用名,id在一個頁面中必須是一個惟一的值;User user = new User();

scope: 指定JavaBean生存的做用域

class: 指定JavaBean的包名及類名

type:id的引用的數據類型,默認狀況下,它與class的類型相同。

 
2 <jsp:getProperty>動做 能夠把JavaBean的某個屬性取出來
語法形式: 

<jsp:getProperty name="beanname" property="propertyname"/>

 1 <jsp:getProperty property="name" name="user"/>

property: 指的是返回JavaBean中的相對應的屬性名 

name: <jsp:useBean>動做中指定的id名,

 
3 <jsp:setProperty>動做 設置JavaBean的屬性值
其有四種語法形式:
<jsp:setProperty name="BeanName" property="屬性名"/>

<jsp:setProperty name="BeanName" property="屬性名" param="參數名"/>

<jsp:setProperty name="BeanName" property="屬性名" value="屬性值" />

<jsp:setProperty name="BeanName" property="*"/>

1 ----.jsp
2 <jsp:setProperty property="name" name="user" param="username"/>
3   <jsp:setProperty property="pwd" name="user" param="pwd"/>
4 
5 
6 ----.html
7  username:<input type="text" name="username"/>
8    pwd  :<input type ="password" name="pwd"/>

 

name: bean的名稱

property:JavaBean相對應的屬性

value設置屬性的值

param將property指定的屬性名的值設置爲一個請求參數的值

property="*"用來設置全部與所獲得的參數同名的屬性值 

三 JSP開發模式1

JSP模式1主要採用JSP和JavaBean技術
將頁面顯示與業務邏輯處理分開
JSP負責頁面的顯示,而業務邏輯則由JavaBean處理   
用戶登陸案例來講明JSP1開發模式:
 
UserBean.java
 
 1 package com.cy.bean;
 2 
 3 import java.io.Serializable;
 4 
 5 
 6 
 7 public class UserBean implements Serializable {
 8     private static final long serialVersionUID = 1L;
 9     
10     private String name;
11     private String pwd;
12     
13     public UserBean () {
14         super();
15     }
16 
17     
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public String getPwd() {
27         return pwd;
28     }
29 
30     public void setPwd(String pwd) {
31         this.pwd = pwd;
32     }
33     
34 
35 }

 

login.html
 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <title>login.html</title>
 5     
 6     <meta name="keywords" content="keyword1,keyword2,keyword3">
 7     <meta name="description" content="this is my page">
 8     <meta name="content-type" content="text/html; charset=UTF-8">
 9     
10     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
11 
12   </head>
13   
14   <body>
15    <form action="/java_web/CheckUser.jsp" method="post">
16    username:<input type="text" name="username"/>
17    pwd  :<input type ="password" name="pwd"/>
18    <input type="submit" value="submit"/>   
19    </form>
20   </body>
21 </html>
CheckUserBean.java
 1 package com.cy.bean;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 
 9 public class CheckUserBean {
10 
11     public boolean checkUser(User user) {
12 
13         String name = user.getName();
14         String pwd = user.getPwd();
15         Connection conn = null;
16         Statement st = null;
17         ResultSet rs = null;
18         String url = "jdbc:mysql://localhost:3306/demo";
19         String user1 = "root";
20         String password = "1234";
21         String sql = "select * from t_user where user_name='" + name
22                 + "' and user_password='" + pwd + "'";
23         try {
24             Class.forName("com.mysql.jdbc.Driver");
25             conn = DriverManager.getConnection(url, user1, password);
26             st = conn.createStatement();
27             rs = st.executeQuery(sql);
28 
29             if (rs.next()) {
30                 return true;
31             }
32         } catch (Exception e) {
33             e.printStackTrace();
34         } finally {
35             try {
36                 rs.close();
37                 st.close();
38                 conn.close();
39             } catch (SQLException e) {
40                 e.printStackTrace();
41             }
42         }
43 
44         return false;
45 
46     }
47
CheckUser.jsp
 
 1 <%@ page language="java" import="java.util.*,com.cy.bean.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'CheckUser.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26     <%CheckUserBean cub=new CheckUserBean(); %>
27   <jsp:useBean id="user" class="com.cy.bean.User" scope="request"></jsp:useBean>
28   <jsp:setProperty property="*" name="user"/>
29   <%if(cub.checkUser(user)) {%>
30   <jsp:forward page="success.jsp"></jsp:forward>
31   <%}else{%>
32   <jsp:forward page="fail.jsp"></jsp:forward>
33   <%} %>
34   </body>
35 </html>
success.jsp
 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'success.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26    <jsp:useBean id="user" class="com.cy.bean.User" scope="request"></jsp:useBean> 
27    
28    歡迎你:<jsp:getProperty property="name" name="user"/>
29   </body>
30 </html>

 

 
四 JSP開發模式2
JSP開發模式2借鑑了MVC架構模式,採用了Servlet+JSP+JavaBean的技術實現JavaWeb的開發。
 
1 MVC架構
在MVC中,模型(model)部分負責管理系統業務數據,視圖(view)部分負責顯示界面,控制器(controller)部分負責與用戶的交互。
                                                MVC示意圖
 
 
2 MVC架構模式的Java Web實現
JSP開發模式2借鑑了MVC架構模式,採用了Servlet+JSP+JavaBean的技術實現JavaWeb的開發。
Servlet充當控制器額角色,負責處理請求和控制業務流程;
JSP充當視圖的角色,負責輸出響應結果;
JavaBean充當模型的角色,負責具體的業務邏輯和業務數據。
其結構如圖:
                                      WebMVC
 
3 JSP模式2開發步驟
–1 定義一系列Bean來表示數據
–2 使用一個Servlet來處理請求
–3 在Servlet中填充Bean
–4 在Servlet中,將Bean存儲到請求、會話或者Servlet上下文中
–5 將請求轉發到JSP頁面
–6 在JSP頁面中,從Bean中提取數據
 
1)
因爲在MVC中,都是有Servlet或者其餘的JAVA程序中建立Bean,因此咱們開發的JavaBean也就再也不須要有空構造器方法。
 1 package com.cy.bean;
 2 
 3 import java.io.Serializable;
 4 
 5 public class User implements Serializable {
 6     
 7     private String name;
 8     private String pwd;
 9 
10     public String getName() {
11         return name;
12     }
13 
14     public void setName(String name) {
15         this.name = name;
16     }
17 
18     public String getPwd() {
19         return pwd;
20     }
21 
22     public void setPwd(String pwd) {
23         this.pwd = pwd;
24     }    
25 
26 }

 

–2 ) 使用一個Servlet來處理請求
–3 )在Servlet中填充Bean
–4 )在Servlet中,將Bean存儲到請求、會話或者Servlet上下文中
–5 )將請求轉發到JSP頁面
 1 package com.cy.servlet;
 2 
 3 import java.io.IOException;
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.sql.Statement;
 9 
10 import javax.servlet.ServletException;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 
15 import com.cy.bean.User;
16 // 須要鏈接數據庫
17 public class LoginServlet extends HttpServlet{
18 
19     @Override
20     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21             throws ServletException, IOException {
22         req.setCharacterEncoding("utf-8");
23         resp.setCharacterEncoding("utf-8");    
24         resp.setContentType("text/html;charset=utf-8");
25 
26        /*使用一個Servlet來處理請求    */    
27         String name = req.getParameter("username");
28         String pwd = req.getParameter("pwd");
29         
30         
31         
32         Connection conn = null;
33         Statement st = null;
34         ResultSet rs = null;
35         String url="jdbc:mysql://localhost:3306/demo";
36         String user = "root";
37         String password  ="1234";
38         String sql = "select * from t_user where user_name='"+name+"' and user_password='"+pwd+"'";
39         
40         //System.out.println(sql);
41         try {
42             Class.forName("com.mysql.jdbc.Driver");
43             conn = DriverManager.getConnection(url,user,password);
44             st = conn.createStatement();
45             rs = st.executeQuery(sql);
46             if(rs.next()){
47             
48               /*    在Servlet中填充Bean*/
49                 User u = new User();
50                 u.setPwd(pwd);
51                 u.setUsername(name);
52                 
53                 
54                 /*在Servlet中,將Bean存儲到請求、會話或者Servlet上下文中*/
55                 req.getSession().setAttribute("user", u);
56                 
57                 /*將請求轉發到JSP頁面*/
58                 req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
59             }else{
60                 req.getRequestDispatcher("/index.jsp").forward(req, resp);
61             }
62         } catch (Exception e) {
63             e.printStackTrace();
64         }finally{
65             try {
66                 rs.close();
67                 st.close();
68                 conn.close();
69             } catch (SQLException e) {
70                 e.printStackTrace();
71             }
72         }
73         
74     }
75 
76     @Override
77     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
78             throws ServletException, IOException {
79         doGet(req, resp);
80     }
81 
82 }

 

這裏還寫了一個簡單的util

 1 package com.cy.util;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 
 9 public class DBUtil {
10     private static String url = "jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8"; 
11     private static String user = "root";
12     private static String pwd = "1234";
13     private DBUtil(){};
14     static{
15         try {
16             Class.forName("com.mysql.jdbc.Driver");
17         } catch (ClassNotFoundException e) {
18             e.printStackTrace();
19         }
20         
21     }
22     
23     public static Connection getConn() throws SQLException{
24         return DriverManager.getConnection(url,user,pwd);
25     }
26     
27     public static void closeRe(Connection conn,Statement st,ResultSet rs){
28         if(rs!=null){
29             try {
30                 rs.close();
31             } catch (SQLException e) {
32                 e.printStackTrace();
33             }finally{
34                 if(st!=null){
35                     try {
36                         st.close();
37                     } catch (SQLException e) {
38                         e.printStackTrace();
39                     }finally{
40                         if(conn!=null){
41                             try {
42                                 conn.close();
43                             } catch (SQLException e) {
44                                 e.printStackTrace();
45                             }
46                         }
47                     }
48                 }
49             }
50         }
51     }
52     
53     public static void closeRe(Connection conn,Statement st) {
54         if(st!=null){
55             try {
56                 st.close();
57             } catch (SQLException e) {
58                 e.printStackTrace();
59             }finally{
60                 if(conn!=null){
61                     try {
62                         conn.close();
63                     } catch (SQLException e) {
64                         e.printStackTrace();
65                     }
66                 }
67             }
68         }
69             
70     }
71     
72 }

 在web.xml配置Servlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 6     <display-name></display-name>
 7     <welcome-file-list>
 8         <welcome-file>index.jsp</welcome-file>
 9     </welcome-file-list>
10 
11     <servlet>
12         <servlet-name>login</servlet-name>
13         <servlet-class>com.cy.servlet.LoginServlet</servlet-class>
14     </servlet>
15 
16     <servlet-mapping>
17         <servlet-name>login</servlet-name>
18         <url-pattern>/login</url-pattern>
19     </servlet-mapping>
20 
21 </web-app>

 

在JSP頁面中,從Bean中提取數據
 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'welcome.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26   welcome頁碼顯示數據
27   <jsp:useBean id="user" type="com.cy.bean.User" scope="session"></jsp:useBean>
28     <p>歡迎你:<jsp:getProperty property="name" name="user"></jsp:getProperty></p>
29   </body>
30 </html>
 
五 在MVC中使用過濾器
在建立Bean後,Servlet使用RequestDispatcher 對象將請求轉發到恰當的JSP頁面
Servlet
 1 package com.cy.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import com.cy.bean.User;
11 
12 public class DemoServlet extends HttpServlet {
13 
14     @Override
15     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
16             throws ServletException, IOException {
17         req.setCharacterEncoding("utf-8");
18         String name = req.getParameter("username");
19         String pwd = req.getParameter("pwd");
20         
21         User user = new User();
22         user.setPwd(pwd);
23         user.setUsername(name);
24         req.getSession().setAttribute("user1", user);
25         String uri = req.getRequestURI();
26         req.getRequestDispatcher(uri).forward(req, resp);
27     }
28 
29     @Override
30     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
31             throws ServletException, IOException {
32         doGet(req, resp);
33     }
34 
35 }
 Filter
 1 package com.cy.filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 
13 import com.lovo.bean.User;
14 
15 public class DemoFilter implements Filter {
16 
17     public void destroy() {
18         // TODO Auto-generated method stub
19         
20     }
21 
22     public void doFilter(ServletRequest arg0, ServletResponse arg1,
23             FilterChain arg2) throws IOException, ServletException {
24         HttpServletRequest req = (HttpServletRequest)arg0;
25         User user = new User();
26         String name = req.getParameter("username");
27         String pwd = req.getParameter("pwd");
28         user.setPwd(pwd);
29         user.setUsername(name);
30         req.getSession().setAttribute("user", user);
31         arg2.doFilter(req, arg1);
32     }
33 
34     public void init(FilterConfig arg0) throws ServletException {
35         // TODO Auto-generated method stub
36         
37     }
38 
39 }

 在web.xml中配置部署Filter,servlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 6     <display-name></display-name>
 7     <welcome-file-list>
 8         <welcome-file>index.jsp</welcome-file>
 9     </welcome-file-list>
10 
11     <filter>
12         <filter-name>jsp</filter-name>
13         <filter-class>com.cy.filter.DemoFilter</filter-class>
14     </filter>
15     <filter-mapping>
16         <filter-name>jsp</filter-name>
17         <url-pattern>/*</url-pattern>
18     </filter-mapping>
19 
30 
31 </web-app>

 小結:

1 JSP腳本使頁面變得簡單、直觀,但可讀性差並且沒有將頁面表現和業務邏輯實現分開,維護難度增長
2 JSP的主要任務是發送文本內容的響應,Servlet控制業務流程可是沒法對業務功能進行復用
3 使用JavaBean把業務邏輯從Servlet中取出來
4 JavaBean本質上就是一個普通的Java類
5 MVC設計模式讓Servlet負責處理請求和控制業務流程,JSP負責輸出響應結果,JavaBean負責具體的業務邏輯和業務數據
6 在MVC模式處理中最後的顯示結果是由Servlet代碼來判斷請求要轉發到哪一個JSP頁面
7 採用過濾器做爲控制器,提供了一個清晰的方法來增長一個新視圖 
相關文章
相關標籤/搜索