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组件具有以下几个特征
为了在JSP页面中使用JavaBean,SUN在JSP规范中提供了三种标准动作。
1 <jsp:useBean>动作 得到或者创建一个JavaBean对象
语法形式:
<jsp:useBean id=“beanName” //变量名 scope=“page|request|session|application” //作用范围 class=“className” //类全路径/>
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="*"/>
name: bean的名称
property:JavaBean相对应的属性
value设置属性的值
param将property指定的属性名的值设置为一个请求参数的值
property="*"用来设置所有与所得到的参数同名的属性值
[b]三 JSP开发模式1[/b]
JSP模式1主要采用JSP和JavaBean技术
将页面显示与业务逻辑处理分开
JSP负责页面的显示,而业务逻辑则由JavaBean处理
用户登录案例来说明JSP1开发模式:
UserBean.java
login.html
CheckUserBean.java
CheckUser.jsp
success.jsp
四 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也就不再需要有空构造器方法。
–2 ) 使用一个Servlet来处理请求
–3 )在Servlet中填充Bean
–4 )在Servlet中,将Bean存储到请求、会话或者Servlet上下文中
–5 )将请求转发到JSP页面
这里还写了一个简单的util
在web.xml配置Servlet
在JSP页面中,从Bean中提取数据
[b]五 在MVC中使用过滤器[/b]
在创建Bean后,Servlet使用RequestDispatcher 对象将请求转发到恰当的JSP页面
Servlet
Filter
在web.xml中配置部署Filter,servlet
小结:
1 JSP脚本使页面变得简单、直观,但可读性差而且没有将页面表现和业务逻辑实现分开,维护难度增加
2 JSP的主要任务是发送文本内容的响应,Servlet控制业务流程但是无法对业务功能进行复用
3 使用JavaBean把业务逻辑从Servlet中取出来
4 JavaBean本质上就是一个普通的Java类
5 MVC设计模式让Servlet负责处理请求和控制业务流程,JSP负责输出响应结果,JavaBean负责具体的业务逻辑和业务数据
6 在MVC模式处理中最后的显示结果是由Servlet代码来判断请求要转发到哪个JSP页面
7 采用过滤器作为控制器,提供了一个清晰的方法来增加一个新视图
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 采用过滤器作为控制器,提供了一个清晰的方法来增加一个新视图
相关文章推荐
- MyEclipse配置SVN,从SVN中捡出项目
- Eclipse的基本使用
- Struts2 简介
- Spring MVC简介
- spring4+springmvc+hibernate4 demo
- (Maven+SSM)实战之spring mybatis整合
- Java Servlet API中文说明文档
- 转载:Eclipse build Android时不生成apk问题解决方法
- Java编程思想学习笔记——枚举类型
- 深入Java单例模式
- Eclipse常用快捷键
- Struts2中的Unable to load configuration错误的分析与解决方法
- Java集合框架复习
- Eclipse全局搜索
- java修改项目名称
- java web 乱码总结
- JDK数据类型Short、Long
- java学习---集合
- Java线程回顾
- 从头认识java-8.3 内部类的.this和.new语法