MVC

来源:互联网 发布:激战2网络错误 编辑:程序博客网 时间:2024/04/28 05:55

学习《轻量级JavaEE企业应用实战》
使用Servlet作为表现层的工作量很大,所有HTML标签都需要使用页面输出流生成,因此使用Servlet作为表现层有以下劣势:

  • 开发效率低,所有HTML标签使用页面输出流输出
  • 不利于团队协作开发,美工人员无法参与Servlet界面的开发
  • 程序可维护性差,即是修改一个按钮都需要重新编译java代码,并重新编译。

在标准的MVC模式中,Servlet仅作为控制器。J2EE的架构也遵循MVC模式,如图
这里写图片描述
MVC的各角色对应组件:

  • M:Model 即模型,对应JavaBean;实现业务逻辑、数据访问逻辑等
  • V:View 即视图 ,对应JSP页面;
  • C : Controller即控制器,对应Servlet;其作用类似调度员:所有请求发送给Servlet,Servlet调用Model来处理请求,并调用JS呈现处理结果;或者Servlet直接调用JSP将应用的状态数据呈现给用户。

使用Servlet作为控制器的例子—登录验证
视图(V):JSP

<%@ page contentType="text/html;charset=gb2312" language="java" errorPage="" %><html>    <head>        <title>Login</title>    </head>    <body>        <!--输出错误提示-->        <font color="red">        <%            if(request.getAttribute("err")!=null)                out.println(request.getAttribute("err"));        %>        </font>        请输入用户名和密码:        <form id="login" method="post" action="loginServlet">            用户名:<input type="text" name="username"/><br>            密&nbsp;&nbsp 码:<input type="password" name="pass"/><br>            <input type="submit" value="登录"/><br>        </form>    </body></html>

控制器(C):Servlet

package lee;import javax.servlet.http.*;import javax.servlet.*;import java.io.*;import java.sql.*;public class LoginServlet extends HttpServlet{    public void service(HttpServletRequest request,HttpServletResponse response)         throws ServletException,java.io.IOException{        String errMsg=" ";        RequestDispatcher rd;        String username=request.getParameter("username");        String pass=request.getParameter("pass");        try{            DbDao dd=DbDao.instance("com.mysql.jdbc.Driver","jdbc:mysql://localhost/test","root","1234");            ResultSet rs=dd.query("select pass from user_servlet where name='"+username+"';");            if(rs.next()){                if(rs.getString("pass").equals(pass)){                    HttpSession session=request.getSession(true);                    session.setAttribute("name",username);                    System.out.println("...........");                    rd=request.getRequestDispatcher("/welcome.jsp");                    rd.forward(request,response);                    return;                }                else{                    errMsg+="用户名密码不符合,请重新输入";                }            }            else{                errMsg+="您的用户名不存在,请先注册";            }        }        catch(Exception e){            e.printStackTrace();        }        if(errMsg!=null &!errMsg.equals("")){            rd=request.getRequestDispatcher("/login.jsp");            request.setAttribute("err",errMsg);            rd.forward(request,response);            return;        }    }}

模型(M):JavaBean

package lee;import java.sql.*;public class DbDao{    private static DbDao op;    private Connection conn;    private String driver;    private String url;    private String username;    private String pass;    private DbDao(){    }    private DbDao(String driver,String url,String username,String pass)throws Exception{        this.driver=driver;        this.url=url;        this.username=username;        this.pass=pass;        Class.forName(driver);        conn=DriverManager.getConnection(url,username,pass);    }    public void setDriver(String driver){        this.driver=driver;    }    public void setUrl(String url){        this.url=url;    }    public void setUsername(String username){        this.username=username;    }    public void setPass(String pass){        this.pass=pass;    }    public String getDriver(){        return driver;    }    public String getUrl(){        return url;    }    public String getUsername(){        return username;    }    public String getPass(){        return pass;    }    public void getConnection()throws Exception{        if(conn==null){            Class.forName(this.driver);            conn=DriverManager.getConnection(url,username,this.pass);        }    }    public static DbDao instance(){        if(op==null){            op=new DbDao();        }        return op;    }    public static DbDao instance(String driver,String url,String username,String pass) throws Exception{        if(op==null){            op=new DbDao(driver,url,username,pass);        }        return op;    }    public boolean insert(String sql)throws Exception{        getConnection();        Statement stmt=this.conn.createStatement();        if(stmt.executeUpdate(sql)!=1){            return false;        }        return true;    }    public ResultSet query(String sql)throws Exception{        getConnection();        Statement stmt=this.conn.createStatement();        return stmt.executeQuery(sql);    }    public void delete(String sql)throws Exception{        getConnection();        Statement stmt=this.conn.createStatement();        stmt.executeUpdate(sql);    }    public void update(String sql)throws Exception{        getConnection();        Statement stmt=this.conn.createStatement();        stmt.executeUpdate(sql);    }}

其中web.xml的配置:

<servlet>    <servlet-name>loginServlet</servlet-name>    <servlet-class>lee.LoginServlet</servlet-class> </servlet> <servlet-mapping>    <servlet-name>loginServlet</servlet-name>    <url-pattern>/loginServlet</url-pattern> </servlet-mapping>

运行情况:
这里写图片描述

运行部署的时候会出现以下问题:

  • web通过jdbc调用MySQL,需要将MySQL的包放入tomcat的lib目录下,重启tomcat
  • 然后一直报错:java.lang.NoClassDefFoundError: lee/DbDao,查询得知是少包jaxrpc.jar,将其放入tomcat的lib目录,重启tomcat。
  • 当运行的时候,报错:”java.lang.IllegalStateException: Cannot forward after response has been committed“,当有多个跳转页面的时候,需要在后边加一个return。服务器中不允许多次跳转。太不智能了!

感觉这种需要手动加包太繁琐,可以考虑用maven,但需要进一步学习

0 0