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> 密   码:<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