周四测试
这次考试的内容是MVC架构,对于这个方面的内容是比较陌生的,老师在考试之前给我们发了考试中的要用的模板和框架,还有这次考试中要用图片,在考试中要先把这个框架拷贝到eclipse中的新建的项目中,然后根据考试要求和已给的框架配置环境,然后完成考试内容。但是在考试中遇到了各种问题,首先是老师发的框架里面各个文件都是干什么用的,其中一个.html文件是登陆文件,主要显示登陆页面,题目中要求在用户第一次登陆的时候需要先注册,但是老师给的模板里面没有注册页面,所以注册页面就需要自己编写,首先得先在数据库里面构建,构造有关登陆用户名、密码、手机号、所属公司的数据表。我的数据库里面的内容如下。
然后我的注册页面内容是:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册</title> </head> <body> <% Object message = request.getAttribute("message");//放置一个字符串,并取出 if(message!=null && !"".equals(message)){ %> <script type="text/javascript"> alert("<%=request.getAttribute("message")%>"); </script> <%} %> <div align="center"> <div><h1>注册</h1></div> <form action="servlet?method=add" method="post" onsubmit="return check()"> <table align="center" border="1" width="50%" cellpadding="6"> <tr> <th colspan="2" align="center" >注册页面</th> </tr> <tr> <td align="center" >用户名</td> <td align="center" ><input type="text" name="user"></td> </tr> <tr> <td align="center" >密码</td> <td align="center" ><input type="text" name="pwd"></td> </tr> <tr> <td align="center" >重复密码</td> <td align="center" ><input type="text" name="randcode"></td> </tr> <tr> <td align="center" >手机号码</td> <td align="center" ><input type="text" name="phonenumber"></td> </tr> <tr> <td align="center" >所属单位</td> <td align="center" ><input type="text" name="unit"></td> </tr> <tr> <th colspan="2" align="center" ><button type="submit" class="b">注 册</button></th> </tr> </table> </form> <div><a href="login.html"><font SIZE="4" >返回登录</font></a></div> </div> <script type="text/javascript"> function check() { var user = document.getElementById("user");; var pwd = document.getElementById("pwd"); var randcode = document.getElementById("randcode"); var phonenumber = document.getElementById("phonenumber"); var unit = document.getElementById("unit"); //非空 if(user.value == '') { alert('账号为空'); user.focus(); return false; } if(pwd.value == '') { alert('确认密码为空'); pwd.focus(); return false; } if(randcode.value == '') { alert('确认密码为空'); randcode.focus(); return false; } if(rpassword.value!= password.value) { alert('两次密码不一致,请重新输入'); rpassword.focus(); return false; } if(phonenumber.value == '') { alert('手机号码为空'); phonenumber.focus(); return false; } if(unit.value == '') { alert('所属单位为空'); unit.focus(); return false; } } </script> </body> </html>
然后我的数据库连接为代码为:
package DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //连接数据库 public class DButil { public static String db_url = "jdbc:mysql://localhost:3306/wdjc"; public static String db_user = "root"; public static String db_pass = "zxh521+."; public static Connection getConn () { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver");//加载驱动 conn = DriverManager.getConnection(db_url, db_user, db_pass); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void main(String[] args) { try { //第三步:获取连接类实例con,用con创建Statement对象类实例 sql_statement Connection con = getConn(); Statement sql_statement = con.createStatement(); String query = "select * from denglu"; ResultSet result = sql_statement.executeQuery(query); //显示数据中network表中的内容: System.out.println("数据库wdjc表denglu中的数据如下:"); System.out.println("------------------------"); System.out.println("user"+" "+"pwd"+" "+"phonenumber" + " " + "unit"+" "); System.out.println("------------------------"); //对获得的查询结果进行处理,对Result类的对象进行操作 while (result.next()) { String user = result.getString("user"); String pwd = result.getString("pwd"); String phonenumber = result.getString("phonenumber"); String unit = result.getString("unit"); //取得数据库中的数据 System.out.println(""+user + " " + pwd+" "+phonenumber+" "+unit+" "); } } catch (SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); } } /** * 关闭连接 * @param state * @param conn */ public static void close (Statement state, Connection conn) { if (state != null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close (ResultSet rs, Statement state, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (state != null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
Dao层的代码为:
package Dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import DBUtil.DButil; import entity.entity; public class dao { public boolean add(entity entity) { String sql = "insert into denglu(user, pwd,phonenumber,unit) values('" + entity.getUser() + "','" + entity.getPwd()+"','"+entity.getPhonenumber()+"','"+entity.getUnit() + "')"; Connection conn = DButil.getConn(); Statement state = null; boolean f = false; int a = 0; try { state = conn.createStatement(); a = state.executeUpdate(sql); } catch (Exception e) { e.printStackTrace(); } finally { DButil.close(state, conn); } if (a > 0) { f = true; } return f; } /** * 登录,比对密码 * @param username * @return */ public String search(String user) { String sql = "select * from denglu where "; if (user != "") { sql= "user like '%" + user + "%'"; } Connection conn = DButil.getConn(); Statement state = null; ResultSet rs = null; String pwd2 = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { pwd2 = rs.getString("pwd"); } } catch (SQLException e) { e.printStackTrace(); } finally { DButil.close(rs, state, conn); } return pwd2; } /** * 登录,比对用户名 * @param username * @return */ public String search1(String user) { String sql = "select * from denglu where "; if (user != "") { sql= "user like '%" + user + "%'"; } Connection conn = DButil.getConn(); Statement state = null; ResultSet rs = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { user = rs.getString("user"); } } catch (SQLException e) { e.printStackTrace(); } finally { DButil.close(rs, state, conn); } return user; } public List<entity> list() { String sql = "select * from denglu"; List<entity> list = new ArrayList<>(); Connection conn = DButil.getConn(); Statement state = null; ResultSet rs = null; try { state = conn.createStatement(); rs = state.executeQuery(sql); entity entity = null; while (rs.next()) { int id = rs.getInt("id"); String user= rs.getString("user"); String pwd = rs.getString("pwd"); String phonenumber = rs.getString("phonenumber"); String unit = rs.getString("unit"); entity = new entity(id,user,pwd,phonenumber,unit); list.add(entity); } } catch (SQLException e) { e.printStackTrace(); } finally { DButil.close(rs, state, conn); } return list; } }
entity层的代码为:
package entity; public class entity { private int id; private String user; private String pwd; private String phonenumber; private String unit; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getPhonenumber() { return phonenumber; } public void setPhonenumber(String phonenumber) { this.phonenumber = phonenumber; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public entity(int id,String user,String pwd,String phonenumber,String unit) { this.id = id; this.user = user; this.pwd = pwd; this.phonenumber = phonenumber; this.unit = unit; } public entity(String user,String pwd,String phonenumber,String unit) { this.user = user; this.pwd = pwd; this.phonenumber = phonenumber; this.unit = unit; } }
servlet层的代码为:
package servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import entity.entity; import Dao.dao; /** * Servlet implementation class servlet */ @WebServlet("/servlet") public class servlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ dao dao = new dao(); protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String method = req.getParameter("method"); if ("add".equals(method)) { add(req, resp); } else if ("search".equals(method)) { search(req, resp); } } private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { String user = req.getParameter("user"); String pwd = req.getParameter("pwd"); String phonenumber=req.getParameter("phonenumber"); String unit = req.getParameter("unit"); entity entity= new entity(user,pwd,phonenumber,unit); if(dao.add(entity)) { req.setAttribute("message", "注册成功!"); req.getRequestDispatcher("login.html").forward(req, resp); }else { req.setAttribute("message", "注册失败!"); req.getRequestDispatcher("zhuce.jsp").forward(req, resp); } } private void search(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { req.setCharacterEncoding("utf-8"); String user = req.getParameter("user"); String pwd = req.getParameter("pwd"); String pwd1 = dao.search(user); String user1 = dao.search1(user); if(pwd.equals(pwd1)&&user.equals(user1)) { req.setAttribute("message", "登陆成功!"); req.getRequestDispatcher("index.html").forward(req,resp); } else { req.setAttribute("message", "用户不存在或密码错误!"); req.getRequestDispatcher("login.html").forward(req,resp); } } }
在注册页面完成之后,在登陆页面点击注册,显示路径错误,路径为没有找到zhu/zhuce.jsp,可是我不明白为zhuce.jsp在zhu这一层文件中,之后我在Webcontent中直接建立zhu这个文件,然后吧zhuce.jsp这个文件剪切进zhu这个文件中,然后在登陆页面中再点注册,然后进入了注册页面。
然后注册通过之后,在登陆页面页面点击输入用户名和密码,还有验证码,点击登陆之后又显示路径错误,缺少dengluservlet这个文件,我感觉特别奇怪,我有servlet这个文件,里面有关于登陆的内容,为什么还需要dengluservlet这个文件。后来我去仔细了解了MVC构架的内容,MVC构架包括控制器、模型、视图。Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型(domain)或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。
MVC 中的模型、视图、控制器三者之间的交互关系:首先是展示视图给用户,用户在这个视图上进行操作,并填写一些业务数据。然后用户会点击提交按钮,来发出请求。视图发出的用户请求会到达控制器,在请求中包含了想要完成什么样的业务功能以及相关的数据。控制器会来处理用户请求,会把请求中的数据进行封装,然后选择并调用合适的模型,请求模型进行状态更新,然后选择接下来要展示给用户的视图。模型会去处理用户请求的业务功能,同时进行模型状态的维护和更新当模型状态发生改变的时候,模型会通知相应的视图,告诉视图它的状态发生了改变。视图接到模型的通知后,会向模型进行状态查询,获取需要展示的数据,然后按照视图本身的展示方式,把这些数据展示出来。
Servlet+JSP+JavaBean模型的响应顺序为:
当用户发出一个请求后,这个请求会被控制器Servlet接收到;Servlet将请求的数据转换成数据模型JavaBean,然后调用业务逻辑模型JavaBean的方法,并将业务逻辑模型返回的结果放到合适的地方,比如请求的属性里;最后,根据业务逻辑模型的返回结果,由控制器来选择合适的视图(JSP),由视图把数据展现给用户。
为保证路径的吻合,还需要配置环境和下载jar包,这样才能保证与框架的路径保持吻合。