MVC

学习《轻量级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,但需要进一步学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值