您的位置:首页 > 编程语言 > Java开发

Java Web开发模式

2015-11-11 22:36 441 查看
一 Java Web开发模式的变迁

1 最初的Java web服务器端编程技术是Servlet,利用Servlet就可以开发出一个Web应用程序。

2 为了解决Servlet缺陷,SUN推出了JSP技术。但是开发人员又走向了另一个极端就是完全放弃了Servlet。

在JSP页面混合使用HTML标记和java代码编写的脚本元素标记来开发Web程序。采用这种方法虽然可以编写JSP页面变得简单,直观,然而,他只适合于业务流程简单,系统规模较小的应用系统。

如果系统较大的话,就会出现两个严重的缺点:

1) 页面严重缺乏可读性。

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()这也不是绝对完美的。

[b]二 在JSP中使用JavaBean[/b]

一个标准的JavaBean组件具有以下几个特征

package com.cy.bean;

import java.io.Serializable;

/*JavaBean 类必须是一个公共类,并将其访问属性设置为 public。*/
/*JavaBean应该是可序列化(serializable)的,即实现java.io.Serializable 接口  */

public class User implements Serializable {
private static final long serialVersionUID = 1L;
/* 一个JavaBean类不应有公共实例变量,类变量都为private */
private int id;
private String name;
private String pwd;
private int postion;

/* JavaBean 类必须有一个空的构造函数,(系统会默认一个无参构造器,如果没有其他的构造器) */
public User() {
super();
}

/* 要访问这些类变量,应该通过一组存取方法(getXxx 和 setXxx)来访问, */
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public int getPostion() {
return postion;
}

public void setPostion(int postion) {
this.postion = postion;
}

}


为了在JSP页面中使用JavaBean,SUN在JSP规范中提供了三种标准动作。

1 <jsp:useBean>动作 得到或者创建一个JavaBean对象
语法形式:

<jsp:useBean id=“beanName” //变量名 scope=“page|request|session|application” //作用范围 class=“className” //类全路径/>

<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"/>

<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="*"/>

----.jsp
<jsp:setProperty property="name" name="user" param="username"/>
<jsp:setProperty property="pwd" name="user" param="pwd"/>

----.html
username:<input type="text" name="username"/>
pwd  :<input type ="password" name="pwd"/>


name: bean的名称

property:JavaBean相对应的属性

value设置属性的值

param将property指定的属性名的值设置为一个请求参数的值

property="*"用来设置所有与所得到的参数同名的属性值

[b]三 JSP开发模式1[/b]

JSP模式1主要采用JSP和JavaBean技术
将页面显示与业务逻辑处理分开
JSP负责页面的显示,而业务逻辑则由JavaBean处理



用户登录案例来说明JSP1开发模式:



UserBean.java

package com.cy.bean;

import java.io.Serializable;

public class UserBean implements Serializable {
private static final long serialVersionUID = 1L;

private String name;
private String pwd;

public UserBean () {
super();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}


login.html

<!DOCTYPE html>
<html>
<head>
<title>login.html</title>

<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
<form action="/java_web/CheckUser.jsp" method="post">
username:<input type="text" name="username"/>
pwd  :<input type ="password" name="pwd"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>


CheckUserBean.java

package com.cy.bean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class CheckUserBean {

public boolean checkUser(User user) {

String name = user.getName();
String pwd = user.getPwd();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
String url = "jdbc:mysql://localhost:3306/demo";
String user1 = "root";
String password = "1234";
String sql = "select * from t_user where user_name='" + name
+ "' and user_password='" + pwd + "'";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user1, password);
st = conn.createStatement();
rs = st.executeQuery(sql);

if (rs.next()) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
st.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

return false;

}
}


CheckUser.jsp

<%@ page language="java" import="java.util.*,com.cy.bean.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'CheckUser.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
<%CheckUserBean cub=new CheckUserBean(); %>
<jsp:useBean id="user" class="com.cy.bean.User" scope="request"></jsp:useBean>
<jsp:setProperty property="*" name="user"/>
<%if(cub.checkUser(user)) {%>
<jsp:forward page="success.jsp"></jsp:forward>
<%}else{%>
<jsp:forward page="fail.jsp"></jsp:forward>
<%} %>
</body>
</html>


success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'success.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

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

欢迎你:<jsp:getProperty property="name" name="user"/>
</body>
</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也就不再需要有空构造器方法。

package com.cy.bean;

import java.io.Serializable;

public class User implements Serializable {

private String name;
private String pwd;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}


–2 ) 使用一个Servlet来处理请求
–3 )在Servlet中填充Bean
–4 )在Servlet中,将Bean存储到请求、会话或者Servlet上下文中
–5 )将请求转发到JSP页面

package com.cy.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cy.bean.User;
// 需要连接数据库
public class LoginServlet extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");

/*使用一个Servlet来处理请求    */
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");

Connection conn = null;
Statement st = null;
ResultSet rs = null;
String url="jdbc:mysql://localhost:3306/demo";
String user = "root";
String password  ="1234";
String sql = "select * from t_user where user_name='"+name+"' and user_password='"+pwd+"'";

//System.out.println(sql);
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,password);
st = conn.createStatement();
rs = st.executeQuery(sql);
if(rs.next()){

/*    在Servlet中填充Bean*/
User u = new User();
u.setPwd(pwd);
u.setUsername(name);

/*在Servlet中,将Bean存储到请求、会话或者Servlet上下文中*/
req.getSession().setAttribute("user", u);

/*将请求转发到JSP页面*/
req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
}else{
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
rs.close();
st.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}

}


这里还写了一个简单的util

package com.cy.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
private static String url = "jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8";
private static String user = "root";
private static String pwd = "1234";
private DBUtil(){};
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

public static Connection getConn() throws SQLException{
return DriverManager.getConnection(url,user,pwd);
}

public static void closeRe(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
}

public static void closeRe(Connection conn,Statement st) {
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

}

}


在web.xml配置Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.cy.servlet.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>

</web-app>


在JSP页面中,从Bean中提取数据

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'welcome.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
welcome页码显示数据
<jsp:useBean id="user" type="com.cy.bean.User" scope="session"></jsp:useBean>
<p>欢迎你:<jsp:getProperty property="name" name="user"></jsp:getProperty></p>
</body>
</html>


[b]五 在MVC中使用过滤器[/b]
在创建Bean后,Servlet使用RequestDispatcher 对象将请求转发到恰当的JSP页面
Servlet

package com.cy.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 com.cy.bean.User;

public class DemoServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");

User user = new User();
user.setPwd(pwd);
user.setUsername(name);
req.getSession().setAttribute("user1", user);
String uri = req.getRequestURI();
req.getRequestDispatcher(uri).forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}

}


Filter

package com.cy.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.lovo.bean.User;

public class DemoFilter implements Filter {

public void destroy() {
// TODO Auto-generated method stub

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)arg0;
User user = new User();
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");
user.setPwd(pwd);
user.setUsername(name);
req.getSession().setAttribute("user", user);
arg2.doFilter(req, arg1);
}

public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}


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

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<filter>
<filter-name>jsp</filter-name>
<filter-class>com.cy.filter.DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jsp</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


小结:

1 JSP脚本使页面变得简单、直观,但可读性差而且没有将页面表现和业务逻辑实现分开,维护难度增加
2 JSP的主要任务是发送文本内容的响应,Servlet控制业务流程但是无法对业务功能进行复用
3 使用JavaBean把业务逻辑从Servlet中取出来
4 JavaBean本质上就是一个普通的Java类
5 MVC设计模式让Servlet负责处理请求和控制业务流程,JSP负责输出响应结果,JavaBean负责具体的业务逻辑和业务数据
6 在MVC模式处理中最后的显示结果是由Servlet代码来判断请求要转发到哪个JSP页面
7 采用过滤器作为控制器,提供了一个清晰的方法来增加一个新视图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: