第一次实现最基本的MVC架构--登录注册查询删除基本操作
2015-12-30 14:52
756 查看
第一部分(model层):底层实现--Dao(基于DbUtils实现) CustomerDao接口 JdbcUtils(C3P0实现) 和实体类Customer(setter和getter方法),以及继承Dao类和CustomerDao接口的实现类
Dao
继承Dao和Customer接口的实现类
第二部分(Controler)是Servlet实现类和xml环境配置
最后就是View层的jsp实现
index.jsp,add.jsp,update.jsp,error.jsp和success.jsp实现
代码中都有详细的个人注释,对MVC架构有了一定的了解,然后下面就是运行图:
Dao
package com.itcast.mvc.dao; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import com.itcast.mvc.jdbc.utils.JdbcUtils; //该泛型是当前DAO绑定的实体类的类型,封装了基本的CRUD方法以供子类继承使用,整个DAO采取DBUtils解决方案。 public class DAO<T> { //获取T所对应的class对象,这里需要用到反射的机制 private Class<T> clazz; //创建一个QueryRunner对象,实现dbutils的工具类使用 private QueryRunner qr=new QueryRunner(); //在构造器中实现泛型反射 public DAO(){ //获取父类带泛型的类型 Type type=getClass().getGenericSuperclass(); //若带参则强转成ParameterizedType类型 if(type instanceof ParameterizedType){ ParameterizedType pt=(ParameterizedType) type; //获取真正泛型参数,调用getActualTypeArguments()方法获取真正的参数 Type[] typeArgs=pt.getActualTypeArguments(); //判断是否含有参数,若含有则继续判断 if(typeArgs!=null&&typeArgs.length>0){ //若typeArgs[0]是Class对象,则将其赋给clazz(强转成Class) if(typeArgs[0] instanceof Class){ clazz=(Class)typeArgs[0]; } } } } //返回某一字段的值 public <E> E getForValue(String sql,Object...agrs){ Connection con=null; try { //通过JdbcUtils工具类直接调用getConnection()方法获取一个连接对象 con=JdbcUtils.getConnection(); //使用DButils中的querryRunner //使用ScalarHandler返回某个特定的值 return (E) qr.query(con, sql, new ScalarHandler(), agrs); } catch (SQLException e) { e.printStackTrace(); }finally{ //最后关闭连接,同样通过JdbcUtils工具类直接调用releaseConnection方法释放连接 JdbcUtils.releaseConnection(con); } return null; } //返回多个查询对象,第一个参数为传进来的sql语句,第二个参数为占位符 public List<T> getForlist(String sql,Object...agrs){ Connection con=null; try { //通过JdbcUtils工具类直接调用getConnection()方法获取一个连接对象 con=JdbcUtils.getConnection(); //使用DButils中的querryRunner中的query方法 //new BeanListHandler<>(泛型对象)返回多个对象,agrs是占位符 return qr.query(con, sql, new BeanListHandler<>(clazz),agrs); } catch (SQLException e) { e.printStackTrace(); }finally{ //最后关闭连接,同样通过JdbcUtils工具类直接调用releaseConnection方法释放连接 JdbcUtils.releaseConnection(con); } return null; } //该方法实现查一个对象,返回对应T的实体类的对象 public T get(String sql,Object...agrs){ Connection con=null; try { //通过JdbcUtils工具类直接调用getConnection()方法获取一个连接对象 con=JdbcUtils.getConnection(); //使用DButils中的querryRunner中的query方法中的new BeanHandler来放回一个对象 //参数con,sql,相应的new Handler(),站位符agrs return qr.query(con, sql, new BeanHandler<>(clazz), agrs); } catch (SQLException e) { e.printStackTrace(); }finally{ //最后关闭连接,同样通过JdbcUtils工具类直接调用releaseConnection方法释放连接 JdbcUtils.releaseConnection(con); } return null; } //该方法封装了insert,delete,update等基本操作,sql代表sql语句,agrs代表sql语句中的占位符,不需要返回值,只需完成操作 public void update(String sql,Object...agrs){ Connection con=null; try { //通过JdbcUtils工具类直接调用getConnection()方法获取一个连接对象 con=JdbcUtils.getConnection(); //使用DButils中的querryRunner中的update方法方便insert,delete和update操作 qr.update(con, sql, agrs); } catch (SQLException e) { e.printStackTrace(); }finally{ //最后关闭连接,同样通过JdbcUtils工具类直接调用releaseConnection方法释放连接 JdbcUtils.releaseConnection(con); } } }Customer接口和Customer实体类
package com.itcast.mvc.dao; import java.util.List; import com.itcast.mvc.domian.Customer; //该接口的方法取决与业务 public interface CustomerDao { public List<Customer> getFuzzySearch(FuzzySearch fs); public List<Customer> getAll(); public void save(Customer customer); public Customer getID(Integer ID); public void delete(Integer ID); public long getCount(String name); public void update(Customer customer); }
package com.itcast.mvc.domian; //实体类 public class Customer { private Integer ID; private String name; private String address; public Integer getID() { return ID; } public void setID(Integer iD) { ID = iD; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Customer() { } public Customer(String name, String address) { super(); this.name = name; this.address = address; } }
继承Dao和Customer接口的实现类
package com.itcast.mvc.dao.implement; import java.util.List; import com.itcast.mvc.dao.CustomerDao; import com.itcast.mvc.dao.DAO; import com.itcast.mvc.dao.FuzzySearch; import com.itcast.mvc.domian.Customer; //定义一个类,用来实现CoustomerDao接口和DAO类,即可以了解一个类专门实现Customer接口中的方法,接口中相应的方法能又实现DAO类中的相应的方法 public class CustomerDaoImp extends DAO<Customer> implements CustomerDao{ //在CustomerDaoImp实现类先实现接口中的方法 //模糊查询方法,两点创建新类获取相应的属性,sql模糊查询实现,这里参数一定是模糊查询的类的对象 public List<Customer> getFuzzySearch(FuzzySearch fs){ //1.先写入sql语句 String sql="select * from studentlist where name like ? and address like ? "; //2.调用Dao中的方法,将sql语句和参数传进去 return getForlist(sql,fs.getName(),fs.getAddress()); } @Override //在CustomerDaoImp实现类先实现接口中的方法 public List<Customer> getAll() { //1.先写入sql语句 String sql="select * from studentlist"; //2.调用Dao中的方法,将sql语句和参数传进去 //此处传进去一个sql语句就好了,不需要站位符 return getForlist(sql); } @Override //在CustomerDaoImp实现类先实现接口中的方法 public void save(Customer customer) { //1.先写入sql语句 String sql="insert into studentlist (name,address) values (?,?)"; //2.调用Dao中的方法,将sql语句和参数传进去 update(sql,customer.getName(),customer.getAddress()); } @Override //在CustomerDaoImp实现类先实现接口中的方法 public Customer getID(Integer ID) { //1.先写入sql语句 String sql="select * from studentlist where id=?"; //2.调用Dao中的方法,将sql语句和参数传进去 return get(sql,ID); } @Override //在CustomerDaoImp实现类先实现接口中的方法 public void delete(Integer ID) { //1.先写入sql语句 String sql="delete from studentlist where id=? "; //2.调用Dao中的方法,将sql语句和参数传进去 update(sql,ID); } @Override //在CustomerDaoImp实现类先实现接口中的方法 public long getCount(String name) { //1.先写入sql语句 String sql="select count(id) from studentlist where name=?"; //2.调用Dao中的方法,将sql语句和参数传进去 return getForValue(sql,name); } @Override public void update(Customer customer) { //修改sql即update 表名 set 字段名=? where 条件=?,这里删除和编辑都是通过id的条件来实现的 String sql="update studentlist set name=?, address=? where id=?"; //只要是update的语句(创建,添加,编辑,删除即都不需要返回值的操作)都调用DAO中的update方法 update(sql,customer.getID(),customer.getName(),customer.getAddress()); } } //底层实现 //底层与数据库打交道的是Dao,该类中方法即CRUD最基本的数据库方法(创建数据库连接,执行sql语句,关闭连接),实现是DBUtils中QerryRunnner和JdbcUtils(c3p0和释放方法) //然后创建接口实体类的Dao,接口中的方法即为具体的CRUD //创建实体类,即属性和get,set方法 //创建实现Dao类和CustomerDao接口的实现类,实现接口中的方法,返回调用Dao中的方法JdbcUtils实现和C3P0环境配置
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- This app is massive! --> <named-config name="mvc"> <property name="user">root</property> <property name="password">123</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///list</property> </named-config> </c3p0-config>
package com.itcast.mvc.jdbc.utils; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; //Jdbc工具类,使用C3P0实现连接池建立 public class JdbcUtils { private static DataSource datasource=null; //加载驱动放到静态代码处,目的是执行一次节约资源 static{ //new一个ComboPooledDataSource类的对象("c3p0配置文件的文件名")转给DataSource的引用 datasource=new ComboPooledDataSource("mvc"); } //释放Connection,将该方法定义为static可以直接使用类名访问 public static void releaseConnection(Connection con){ if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } //获取一个Connection对象,将该方法定义为static可以直接使用类名访问 static public Connection getConnection() throws SQLException{ return datasource.getConnection(); } }
第二部分(Controler)是Servlet实现类和xml环境配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>MVC1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>Servlet</display-name> <servlet-name>Servlet</servlet-name> <servlet-class>com.itacast.servlet.Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
package com.itacast.servlet; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.itcast.mvc.dao.CustomerDao; import com.itcast.mvc.dao.FuzzySearch; import com.itcast.mvc.dao.implement.CustomerDaoImp; import com.itcast.mvc.domian.Customer; /** * Servlet implementation class Servlet */ public class Servlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Servlet() { super(); } //用具体实现类对象创建CustomerDao对象,实现多态 private CustomerDao cd=new CustomerDaoImp(); /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //此处调用doPost方法,且传进去的参数与doGet方法,达到一样 doPost(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ //超链接一般都写在doPost中 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取servletpath即超链接的地址 String servletpath=request.getServletPath(); //将获取的连接路径仅留下方法名 String methodname=servletpath.substring(1,servletpath.length()-3); //System.out.println(methodname); try { //利用反射原理获取相应的方法getClass方法获取该类,此处省略了对象名就是this //getDeclaredMethod(方法名,参数列表的类方法 即类型.class)方法获取相应的声明方法 Method method=getClass().getDeclaredMethod(methodname,HttpServletRequest.class,HttpServletResponse.class); //调用invoke方法执行方法,invoke方法中第一个参数为类的实例对象,后面参数为相应函数中的参数 method.invoke(this, request, response); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { //当没有该方法时,给予响应,即给出响应jsp response.sendRedirect("error.jsp"); } catch (SecurityException e) { e.printStackTrace(); } } //实现servlet和jsp之间的调用三步:1.获取方法的返回值,然后调用setAttribute方法传进去,最后调用getRuequestDispatcher方法实现转发或者重定向, //该处为转发。 private void query(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ //1.先调用getParameter方法收集请求参数 String name=request.getParameter("Name"); String address=request.getParameter("Address"); //创建FuzzySearch类的对象,并将获取的请求参数对FuzzySearch类对象进行初始化 FuzzySearch fs=new FuzzySearch(name,address); //再调用getFuzzySearch方法执行模糊查询并将返回结果返回到customers对象的list中 List<Customer> customers=cd.getFuzzySearch(fs); //1.获取Customer集合 //List<Customer> customers=cd.getAll(); //2.将customer集合放入request中,调用setAttribute("属性名",属性),这里即为属性名(页面上getAttribute获取的属性名),customer为传进去的属性 request.setAttribute("customers",customers ); //3.转发页面到index.jsp,先调用getRequestDispathcer("转发的页面")方法,然后调用forward(request,response)方法 //不能使用重定向 request.getRequestDispatcher("/index.jsp").forward(request, response); } private void edit(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ //先将forward即响应页面为error.jsp String forward="/error.jsp"; //1.编辑先获取ID String idstr =request.getParameter("ID"); try { //2.通过id获取相应的customer对象赋给customer对象 Customer customer=cd.getID(Integer.parseInt(idstr)); if(customer!=null){ //3.将获取的customer放到request中,然后响应update.jsp request.setAttribute("customer",customer); //若不为空,即获取到customer,然后响应到update.jsp页面进行编译 forward="/update.jsp"; } } catch (NumberFormatException e) { e.printStackTrace(); } //4.响应update.jsp request.getRequestDispatcher(forward).forward(request, response); } private void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ String name=request.getParameter("Name"); String address=request.getParameter("Address"); String id=request.getParameter("ID"); String oldname=request.getParameter("oldname"); //若oldname与name不相同即需要判断更改的名字是否已经占用,若相同则不需要判断 if(!oldname.equalsIgnoreCase(name)){ if(cd.getCount(name)>0){ request.setAttribute("message", "该用户名"+name+"已经被占用,请重新填写!"); request.getRequestDispatcher("/upate.jsp").forward(request, response); return; } } Customer customer=new Customer(name,address); //这里需要把id设置进去 customer.setID(Integer.parseInt(id)); //如果没有被占用就调用相应的update方法进行update cd.update(customer); response.sendRedirect("query.do"); } //Servlet调用的方法都是CustomerDao中实现接口Customer中的方法,Customer接口方法通过Dao来实现 private void add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ String name=request.getParameter("Name"); String address=request.getParameter("Address"); //因为如果返回大于0,表示该名字已经存在不能添加了 if(cd.getCount(name)>0){ request.setAttribute("message", "用户名"+name+"已被占用,请重新填写!"); //若被占用就请求转发到add.jsp重新添加 request.getRequestDispatcher("/add.jsp").forward(request, response); return; } //若没有存在则正常调用save方法进行添加保存到数据库中 cd.save(new Customer(name,address)); //然后在重定向到添加成功的jsp response.sendRedirect("success.jsp"); } private void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ //获取请求参数getPartementer("") String idstr=request.getParameter("ID"); int id=0; try{ id=Integer.parseInt(idstr); //Servlet调用的CRUD都是调用Customer接口中的方法 //cd是Customer接口对象指向CustomerDaoImp实现类对象 //将获取的请求参数传到delete方法中 cd.delete(id); //此处使用重定向为了保持在index.jsp当前页面,这里参数是query.do,即Servlet的URL映射*.do,此处为query.do response.sendRedirect("query.do"); }catch(Exception e){ //当没有该方法时,response对象给予响应,即给出响应jsp,sendRedirect重定向 e.printStackTrace(); //此处使用重定向为了保持在index.jsp当前页面 response.sendRedirect("query.do"); } } }
最后就是View层的jsp实现
index.jsp,add.jsp,update.jsp,error.jsp和success.jsp实现
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.List"%> <%@ page import="com.itcast.mvc.domian.Customer;" %> <!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=ISO-8859-1"> <title>Insert title here</title> <!-- javascript代码一般写在tile后 ,第一行导包--> <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script> <!-- 下面写js代码 --> <script type="text/javascript"> $(function(){ $(".delete").click(function(){ //content获取标签里面的名字 //this是a,parent是td,parent是tr,id是第一列,名字是第二个即1(从0开始) var content=$(this).parent.parent.find("td:eq(1)").text; //要删除的名字,即content var flag=confirm("确定要删除"+content+"用户吗?"); //返回ture正常执行,返回false取消执行 return flag; }) }) </script> </head> <body> <!-- 表结构标签from,action=“映射的servlet”,method=“请求方式” --> <form action="query.do" method="post"> <!-- 使用table产生一张表 --> <table> <!-- tr行 --> <tr> <!-- td列 --> <td>Name :</td> <!-- input添加文本框或者按钮,type=“属性类型” name=“属性名字” --> <td><input type="text" name="Name"/></td> </tr> <tr> <td>ID :</td> <td><input type="text" name="ID"/></td> </tr> <tr> <td>Address :</td> <td><input type="text" name="Address"/></td> </tr> <tr> <!-- 提交按钮和超链接 --> <td><input type="submit" value="Query"/></td> <!-- 这里超链接href="超链接的jsp(即给出一个超链接的响应页面jsp),<a>中间为显示超链接的名字</a>" --> <td><a href="add.jsp">Add new Students</a></td> </tr> </table> </form> <br><br> <!-- 定义一个list对象接收getAttribute("setAttribute方法中的属性名")返回对象 --> <% List<Customer> customers=(List<Customer>)request.getAttribute("customers"); if(customers!=null && customers.size()>0){ %> <!-- 加条水平线 --> <hr> <br> <!-- border边框宽度,cellpadding用于隔开单元格与单元格间距,cellspacing单元格补白之间的距离--> <table border="1" cellpadding="10" cellspacing="0"> <!-- 该处为第一行,即头 --> <tr> <!-- <td>表示内容单元格 <th>则表示标题--> <th>ID</td> <th>Name</td> <th>Address</td> <th>Update</th> <th>Delete</th> </tr> <!-- 将表格多少行放如到for循环中,因为取决于有多少个用户数 ,每一循环创建一行,和相应的列数构成表--> <% for(Customer customer:customers){ %> <!-- 一行tr ,里面包含着列td,th一般用于标题--> <tr> <!-- 调用相应实体类即Customer类中的具体方法,获取相应的值,显示在jsp中 --> <td><%=customer.getID()%></td> <td><%=customer.getName()%></td> <td><%=customer.getAddress()%></td> <!-- 该处放两个超链接,即Update和Delete ,href=""空时就没有超链接页面--> <td><a href="edit.do?ID=<%=customer.getID()%>" class="update">Update</a></td> <!-- 此处超链接后面给请求参数即?参数 --> <!-- 凡是像删除或者修改都是具体对象时都采用?传参数的形式来确定具体对象 --> <td><a href="delete.do?ID=<%=customer.getID()%>" class="delete">Delete</a></td> </tr> <% } %> </table> <% } %> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.itcast.mvc.domian.Customer;" %> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <!-- setAttribute的属性通过getAttribute方法来获取 --> <% Object msg=request.getAttribute("message"); if(msg!=null){ %> <!-- 如果是java代码(即取变量中的值)一定要用百分号表达式,否则就显示文本信息! --> <font color="red"><%=msg%></font> <% } %> <!-- 编写add的响应jsp,核心是action=""(将web.xml的url地址设为.do)然后通过反射从/add.do获取add即方法名, 再找到Servlet中相应的方法,执行Customer接口中的方法,实现与数据库间的操作 --> <form action="add.do" method="post"> <table> <tr> <td>Name :</td> <td><input type="text" name="Name" value="<%=request.getParameter("Name")==null?"":request.getParameter("Name")%>"/></td> </tr> <tr> <td>Address :</td> <td><input type="text" name="Address" value="<%=request.getParameter("Address")==null?"":request.getParameter("Address")%>"/></td> </tr> <tr> <td><input type="submit" value="Submit"/></td> </tr> </table> </form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.itcast.mvc.domian.Customer"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% Object msg=request.getAttribute("message"); if(msg!=null){ %> <font color="red"><%=msg%></font> <% } String name=null; String id=null; String address=null; String oldname=null; Customer customer=(Customer)request.getAttribute("customer"); if(customer!=null){ name=customer.getName(); //int+""即转变成String类型 id=customer.getID()+""; address=customer.getAddress(); oldname=customer.getName(); }else{ id=request.getParameter("ID"); oldname=request.getParameter("Name"); name=request.getParameter("Name"); address=request.getParameter("Address"); } %> <form action="update.do" method="post"> <input type="hidden" name="ID" value="<%=id%>"/> <input type="hidden" name="oldname" value="<%=oldname%>"/> <table> <tr> <td>Name :</td> <td><input type="text" name="Name" value="<%=name%>"/></td> </tr> <tr> <td>Address :</td> <td><input type="text" name="Address" value="<%=address%>"/></td> </tr> <tr> <td><input type="submit" value="Submit"/></td> </tr> </table> </form> </body> </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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h4>对不起,请求有误!</h4> </body> </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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h4>用户添加成功!</h4> <!-- href="超链接的jsp" 然后就是超链接的名字--> <h4><a href="index.jsp">返回</a><h4> </body> </html>
代码中都有详细的个人注释,对MVC架构有了一定的了解,然后下面就是运行图:
相关文章推荐
- 那些你必须要刷的网站
- 11大精选Android自学网站
- 大型网站的架构设计图分享
- 学习资料收集
- 如何成为优秀的架构师
- MVC架构
- 购物网站数据库表
- ab网站压力测试命令的参数、输出结果的中文注解
- 架构中类的关系
- 雅虎网站页面性能优化的34条黄金守则
- IM架构资料收集
- MVC 网站部署常见问题汇总
- 近一个月的努力,我的第一个网站《茶余饭后网》终于上线了
- [Windows Server 2012] 手工创建安全网站
- Best Practices for Speeding Up Your Web Site--如何加速你的网站访问性能
- 解析各大电子商务网站订单号的生成方式
- Java爬虫实战(一):抓取一个网站上的全部链接
- Android:Android应用程序架构
- 网站平滑迁移到LNMP或LAMP建站环境的方法
- iOS应用架构谈 好文