Java Web---Model1&Model2

两种开发模式为整个WEB的核心操作,其中以模式二最为重要。


在实际的WEB开发中,有两种主要的开发结构,称为模式一(Model 1)模式二(Model 2)

Model 1

Model 1就是指在开发中将显示层、控制层、数据层的操作统一交给JSP或者是JavaBean来进行处理。


客户端现在通过访问的JSP,调用里面的JavaBean,而通过JavaBean调用数据库。

在JavaBean中就包含了有专门负责处理数据的操作,数据层主要是以DAO为主,除了数据之外还包含了业务的处理。

在整个的开发中本身就存在了一个问题,现在的程序肯定是需要JSP+JavaBean一起开发完成后才可以使用,此时就可能出现推诿的问题。例如:美工同志说了,程序员你必须先写程序,我再做美工,程序员说了,你美工同志必须先做美工我再写程序,所以,这种的开发本身只适合于较快速的开发,但是后期维护困难,可以发现这种开发之后的代码在JSP文件之中,Scriptlet代码非常的多的。


Model2

Model2:Model-View-Controller

在Model2中所有的开发都是以Servlet为主体展开的,由Servlet接收所有的客户端请求,之后根据请求调用相应的JavaBean,并将所有的显示结果交给JSP完成,也就是俗称的MVC设计模式


Servlet特点:可以接收用户的请求参数,还可以调用Java程序,而且由于其本身就是以Java程序运行的,所以肯定要比JSP性能高很多的,而且安全性也高。

最终Servlet所有操作的内容都要交给JSP进行显示,这样一来,Servlet的缺点(不方面显示)就避免了。

JavaBean完成具体的单个的功能:JSP完成显示的功能,而Servlet负责连接JSP和JavaBean。

JSP—》Servlet—》JavaBean。这种设计非常适合于大型项目的开发,而且维护方便。


MVC处理流程

在MVC设计模式中,最关键的部分就是要使用RequestDispatcher接口,因为显示内容都是通过此接口保存到JSP页面上进行显示的。


    MVC有自己的处理流程,实际上最重要的就是输出和跳转的问题了。

而且一定要再次强调,由于所有的内容都是要交给JSP进行显示,那么这个时候最方便的属性范围就是request属性范围,例如,以一个用户列表操作为例,可以发现,JSP中只是负责显示数据而已,但是这些数据如果要是通过MVC设计模式完成的话,肯定这些数据只是在一个JSP中显示一次即可。而且Servlet应该负责将所有的一次显示的内容交给JSP完成,那么最适合的属性范围就是request范围了,因为之前强调过:能用page(pageContext)就不要使用request,能用request就不要使用session,能使用session就不要使用application。

从实际的开发来讲,session属性范围用于登录验证上使用较多,而request范围主要的功能就是在MVC设计模式上,将Servlet的内容交给JSP显示,而且这种显示在另外一次提交之后属性就消失了。

在使用MVC设计模式中往往都通过request将内容传递到JSP进行显示。


使用MVC开发(程序流程图)【用户登录程序】


登录程序之前已经学习过,是使用JSP+JDBC完成的开发操作,但是之前的登录程序开发中可以发现有很多问题,就是一个JSP文件中代码过多了,即使是使用了JSP+JavaBean的开发模式,其本身也存在JSP中代码过多的问题。今天我们利用MVC模式解决这些问题。



我们创建数据库的表的脚本如下:

DROP TABLE user ; -- 删除表

CREATE TABLE user(

userid VARCHAR(30)     PRIMARY KEY ,

name VARCHAR(30) NOT NULL ,

password  VARCHAR(32) NOT NULL 

) ;

INSERT INTO user(userid,name,password) VALUES ('admin','administrator','admin') ;


数据库创建脚本完毕之后,那么下面就开始进行程序的开发操作了。

DAO的操作主要是完成数据层的操作,但是下面在MVC设计模式之中,还有Servlet也很重要,建立一个LoginServlet.java的操作类。

我们配置此Servlet如下:

<servlet>

    <servlet-name>login</servlet-name>

    <servlet-class>com.skewrain.demo3.servlet.LoginServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>login</servlet-name>

    <url-pattern>/mvclogin/LoginServlet</url-pattern>

</servlet-mapping>

在MVC开发中注意,客户端验证和服务器端的验证都需要进行处理的操作。

而且从这道程序中,读者也可以发现这样的一个问题,以前的JSP页面中的代码实在是太多了,但是现在的代码明显比以前少很多,实际上对于一个JSP页面应该只包含如下的代码。

【User.java】

package com.skewrain.demo3.vo;
public class User
{
private String userid;
private String name;
private String password;
public void setUserid(String userid){
this.userid = userid;
}
public void setName(String name){
this.name = name;
}
public void setPassword(String password){
this.password = password;
}
public String getUserid(){
return this.userid;
}
public String getName(){
return this.name;
}
public String getPassword(){
return this.password;
}
}

【DatabaseConnection.java】

package com.skewrain.demo3.dbc;
import java.sql.*;
public class DatabaseConnection{
private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
private static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";
private static final String DBUSER = "root";
private static final String DBPASSWORD = "mysqladmin";
private Connection conn = null;
public DatabaseConnection() throws Exception{
try{
   Class.forName(DBDRIVER);
   this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
}catch(Exception e){
throw e;
}
}
public Connection getConnection(){
return this.conn;
}
public void close() throws Exception{
if(this.conn != null){
try{
this.conn.close();
}catch(Exception e){
throw e;
}
}
}
}

【IUserDAO.java】

package com.skewrain.demo3.dao;
import com.skewrain.demo3.vo.User;
public interface IUserDAO{
//现在完成的是登录验证,那么登录操作只有两种返回结果。
public boolean findLogin(User user) throws Exception;
}

【UserDAOImpl.java】

package com.skewrain.demo3.dao.impl;
import com.skewrain.demo3.vo.User;
import com.skewrain.demo3.dbc.*;
import com.skewrain.demo3.dao.*;
import java.sql.*;
public class UserDAOImpl implements IUserDAO{
private Connection conn = null;
private PreparedStatement pstmt = null;
public UserDAOImpl(Connection conn){
this.conn = conn;
}
public boolean findLogin(User user) throws Exception{
boolean flag = false;
String sql = "SELECT name FROM user WHERE userid=? AND password=?";
this.pstmt = this.conn.prepareStatement(sql);  //一定要注意是prepareStatement而不是preparedStatement。
this.pstmt.setString(1,user.getUserid());
this.pstmt.setString(2,user.getPassword());
ResultSet rs = this.pstmt.executeQuery();
if(rs.next()){
user.setName(rs.getString(1));//取出一个用户的真实姓名
flag = true;
}
this.pstmt.close();
return flag;
}
}

【UserDAOProxy.java】

package com.skewrain.demo3.dao.proxy;
import com.skewrain.demo3.vo.User;
import com.skewrain.demo3.dbc.*;
import com.skewrain.demo3.dao.*;
import com.skewrain.demo3.dao.impl.*;
import java.sql.*;
public class UserDAOProxy implements IUserDAO{
private DatabaseConnection dbc = null;
private IUserDAO dao = null;
public UserDAOProxy(){  //代理的主要功能是负责关闭的。
try{
this.dbc = new DatabaseConnection();
}catch(Exception e){
e.printStackTrace();
}
this.dao = new UserDAOImpl(dbc.getConnection());
}
public boolean findLogin(User user) throws Exception{
boolean flag = false;
        try{
            flag = this.dao.findLogin(user);//调用真实主题,完成操作。
}catch(Exception e){
throw e;
}finally{
this.dbc.close();
}
return flag;
}
}

【DAOFactory.java】

package com.skewrain.demo3.factory;
import com.skewrain.demo3.dao.*;
import com.skewrain.demo3.dao.proxy.*;
public class DAOFactory {
public static IUserDAO getIUserDAOInstance(){
return new UserDAOProxy();
}
}
【LoginServlet.java】

package com.skewrain.demo3.servlet;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.skewrain.demo3.factory.*;
import com.skewrain.demo3.vo.*;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse resp)

                throws ServletException,IOException{
String path = "login.jsp";
String userid = req.getParameter("userid");
String userpass = req.getParameter("userpass");
List<String> info = new ArrayList<String>(); //收集错误
if(userid==null || "".equals(userid)){
info.add("用户id不能为空!");
}
if(userpass==null || "".equals(userpass)){
info.add("密码不能为空!");
}
if(info.size()==0){//里面没有记录任何的错误。
User user = new User();
user.setUserid(userid);
user.setPassword(userpass);
try{
if(DAOFactory.getIUserDAOInstance().findLogin(user)){
info.add("用户登录成功,欢迎" + user.getName() + "光临!");
}else{
info.add("用户登录失败,错误的用户名和密码!");
}
}catch(Exception e){
e.printStackTrace();
}
}
req.setAttribute("info",info);
req.getRequestDispatcher(path).forward(req,resp);
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)

                throws ServletException,IOException{
this.doGet(req,resp);
}
}
【login.jsp】

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>www.baidu.com</title></head>
<body>
<script language="javascript">
    function validate(f){
if(!(/^\w{5,15}$/.test(f.userid.value))){//格式为:/^$/
alert("用户ID必须是5~15位!");
f.userid.focus();
return false;
}
if(!(/^\w{5,15}$/.test(f.userpass.value))){
alert("密码必须是5~15位!");
f.userpass.focus();
return false;
}
    }
</script>
<%
    request.setCharacterEncoding("GBK");
%>
<%
    List<String> info = (List<String>)request.getAttribute("info");
if(info != null){ //有信息返回
Iterator<String> iter = info.iterator();
while(iter.hasNext()){
%>
                     <h4><%=iter.next()%></h4>
<%
        }
}
%>
<form action="LoginServlet" method="post" onSubmit="return validate(this)">
        用户ID:<input type="text" name="userid"><br>
密&nbsp;&nbsp码:<input type="password" name="userpass"><br>
    <input type="submit" value="登录">
    <input type="reset" value="重置">
</body>
</html>

通过本道MVC程序,读者可以清楚的感觉到,与最初的JSP开发(例如:JSP+JDBC或者是JSP+DAO)相比,现在的JSP页面中的代码已经减少了很多,只是简单的完成了输出,实际上在开发中,读者一定要记住JSP中最好只包含以下三种类型的代码:

1):接收属性:接收从Servlet传递过来的属性;

2):判断语句:判断传递到JSP中的属性是否存在;

3):输出内容:使用迭代或者是VO进行输出。

一定要记住一点,在JSP页面中唯一允许导入的包只能是java.util包,只要能把握住这一点,就可以开发出一个简洁、清晰的JSP页面。

一个好的JSP页面应该不导入任何的一个开发包。


小结:

1)明白MVC的实际的开发作用,以及JSP、Servlet、DAO的各个组成部分的作用。DAO只是负责数据的操作,JSP只是负责显示,Servlet只是负责接收参数,调用JavaBean,并进行跳转的功能。

2)通过本实例充分理解MVC设计模式的好处

   a.JSP只负责显示

   b.DAO负责数据层操作

   c.Servlet连接JSP和DAO,并根据JavaBean的操作结果进行跳转。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值