先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了!
创建数据库
create database jdbc01 character set utf8 collate utf8_general_ci;
创建表:
use jdbc01;
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date,
sex boolean
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
运行的效果:
一、创建MVC架构的Web项目
与mysql 需要的包是
项目所需要的包 |
|||
序号 |
包名 |
描述 |
所属层次 |
1 |
zhu.jdbc.domain |
相当于数据库的某张表 (只包含简单的属性以及属性对应的get和set方法,不包含具体的业务处理方法),提供给【数据访问层】、【业务处理层】、【Web层】来使用 |
domain(域模型)层 |
2 |
zhu.jdbc.dao |
存放访问数据库的操作接口类 |
数据访问层 |
3 |
zhu.jdbc.dao.imp |
存放访问数据库的操作接口的实现类 |
|
4 |
zhu.jdbc.service |
存放处理系统业务接口类 |
业务处理层 |
5 |
zhu.jdbc.service.imp |
存放处理系统业务接口的实现类 |
|
6 |
zhu.jdbc.command |
相当于数据库命令的 增删查改 |
相当于三层架构的(DB层) |
7 |
zhu.jdbc.unit |
存放系统的通用工具类,提供给【数据访问层】、【业务处理层】、【DB层】来使用 |
|
8 |
zhu.jdbc.servlet |
|
Web层(相当于界面层) |
创建好的项目如下图(图-1)所示:
图-1
二、代码的编写
1. zhu.jdbc.unit的包编写
在zhu.jdbc.unit包下创建一个UnitMysql的类(这个类是建立与mysql的链接)
UnitMysql代码如下:
1 package zhu.jdbc.unit; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 public class UnitMysql { 10 public static final String URL="jdbc:mysql://localhost:3306/jdbc01";//链接的mysql 11 public static final String NAME = "root"; 12 public static final String PASSWORD = "root"; 13 public static final String DREIVER = "com.mysql.jdbc.Driver"; 14 15 16 static { 17 try { 18 //加载驱动器 19 Class.forName(DREIVER); 20 21 /*//还有另一种方法,但是会加载驱动二次,通常不使用该方法 22 try { 23 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }*/ 27 } catch (ClassNotFoundException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 public static Connection getConnection() { 33 try { 34 return DriverManager.getConnection(URL, NAME, PASSWORD);//创建与数据库的链接 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 return null; 39 } 40 //设置一个公共的关闭链接、释放资源的方法 . 因为每次只要进行了增,删,查,改 之后 都必须要关闭事件, 那么就设置一个公共的方法 41 //而关闭资源要从 ResultSet先关闭-->,再到 PreparedStatement-->,最后到 Connection关闭 42 public static void Close(ResultSet rs, PreparedStatement ps, Connection conn) { 43 if (rs != null) { 44 try { 45 rs.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 51 if (ps != null) { 52 try { 53 ps.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 if (conn != null) { 60 try { 61 conn.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 } 66 } 67 }
2. 相当于三层架构的(DB层)
在zhu.jdbc.command包下创建一个IDaoCommand的类(这个类是建立与mysql的链接)
IDaoCommand代码如下:
1 package zhu.jdbc.command; 2 3 import java.util.List; 4 5 public interface IDaoCommand<T> { 6 //查询所有的数据 7 public List<T> queryAllData(); 8 //新增数据 9 public int insertData(T t); 10 //修改数据 11 public int update(T t); 12 //删除数据 13 public int delete(int id); 14 //查询一条数据通过ID 15 public T queryDataById(int id); 16 }
3. domain(域模型)层
在zhu.jdbc.domain 包下创建一个Tb_User 类
Tb_User 代码如下:
1 package zhu.jdbc.domain; 2 3 import java.sql.Date; 4 //这里相当于数据库的某张表 5 public class Tb_User { 6 private int id; 7 private String name; 8 private String password; 9 private String email; 10 private Date birthday; 11 private boolean sex; 12 13 public boolean isSex() { 14 return sex; 15 } 16 public void setSex(boolean sex) { 17 this.sex = sex; 18 } 19 public int getId() { 20 return id; 21 } 22 public void setId(int id) { 23 this.id = id; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public String getPassword() { 32 return password; 33 } 34 public void setPassword(String password) { 35 this.password = password; 36 } 37 public String getEmail() { 38 return email; 39 } 40 public void setEmail(String email) { 41 this.email = email; 42 } 43 public Date getBirthday() { 44 return birthday; 45 } 46 public void setBirthday(Date birthday) { 47 this.birthday = birthday; 48 } 49 }
4.开发数据访问层(dao、dao.impl)
2.1: dao 继承 command的命令
在zhu.jdbc.dao包下创建一个ITb_User接口类,对于开发接口类,我习惯以字母I作类的前缀.
ITb_User代码如下:
1 package zhu.jdbc.dao; 2 3 import zhu.jdbc.command.IDaoCommand; 4 import zhu.jdbc.domain.Tb_User; 5 6 /** 7 * 这里这个类 是为了 ,后续 添加自己需要的方法. 如:模糊查询, 分页查询.... 8 * 这个必须要继承ICommand类,那样就可以调用增删查改的方法了 9 * @author Xiao_Zhu 10 * 11 */ 12 public interface ITb_User extends IDaoCommand<Tb_User> { 13 //自己需要的方法 14 }
2.2: dao.ImpI 实现 dao
在zhu.jdbc.dao.imp包下创建一个ITb_UserImpI类
ITb_UserImpI代码如下:
1 package zhu.jdbc.dao.imp; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 import java.sql.SQLException; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import zhu.jdbc.dao.ITb_User; 12 import zhu.jdbc.domain.Tb_User; 13 import zhu.jdbc.unit.UnitMysql; 14 15 /** 16 * 实现 ITb_User类 17 * 18 * @author Xiao_Zhu 19 * 20 */ 21 public class ITb_UserImpI implements ITb_User { 22 public Connection conn1 = null; 23 public ResultSet rs = null; 24 public PreparedStatement ps = null; 25 26 // 查询所有的数据 27 @Override 28 public List<Tb_User> queryAllData() { 29 conn1 = UnitMysql.getConnection();// 链接数据库 30 List<Tb_User> list = new ArrayList<Tb_User>(); 31 try { 32 String sqlSelect = "select * from users "; // 查询多条数据 33 ps = conn1.prepareStatement(sqlSelect); 34 rs = ps.executeQuery(); 35 Tb_User user = null; 36 while (rs.next()) { 37 user = new Tb_User(); 38 user.setId(rs.getInt("id")); 39 user.setName(rs.getString("name")); 40 user.setPassword(rs.getString("password")); 41 user.setBirthday(rs.getDate("birthday")); 42 user.setSex(rs.getBoolean("sex")); 43 list.add(user); 44 } 45 } catch (SQLException e) { 46 e.printStackTrace(); 47 } finally { 48 UnitMysql.Close(rs, ps, conn1); 49 } 50 return list; 51 } 52 53 // 新增 54 @Override 55 public int insertData(Tb_User t) { 56 conn1 = UnitMysql.getConnection(); 57 int i = 0; 58 try { 59 String sqlInsert = "insert into users(name,password,email,birthday,sex) values(?,?,?,?,?) ;"; 60 ps = conn1.prepareStatement(sqlInsert, 61 PreparedStatement.RETURN_GENERATED_KEYS); 62 // 这里的1,2..必须要按上面的新增的顺序来定义 63 ps.setString(1, t.getName()); 64 ps.setString(2, t.getPassword()); 65 ps.setString(3, t.getEmail()); 66 ps.setDate(4, new java.sql.Date(t.getBirthday().getTime())); 67 ps.setBoolean(5, t.isSex()); 68 ps.executeUpdate(); 69 rs = ps.getGeneratedKeys();// 得到 最新的 ID 70 if (rs.next()) {// 是否存在 71 i = rs.getInt(1); 72 } 73 } catch (SQLException e) { 74 e.printStackTrace(); 75 } finally { 76 UnitMysql.Close(rs, ps, conn1); 77 } 78 return i; 79 } 80 81 // 修改 82 @Override 83 public int update(Tb_User t) { 84 conn1 = UnitMysql.getConnection(); 85 int i = 0; 86 try { 87 String sqlUpdate = "update users set name=?, password =? ,sex=? where id=?"; 88 ps = conn1.prepareStatement(sqlUpdate); 89 ps.setString(1, t.getName()); 90 ps.setString(2, t.getPassword()); 91 ps.setBoolean(3, t.isSex()); 92 ps.setInt(4, t.getId()); 93 i = ps.executeUpdate(); 94 } catch (SQLException e) { 95 e.printStackTrace(); 96 } finally { 97 UnitMysql.Close(null, ps, conn1); 98 } 99 return i; 100 } 101 102 // 删除 103 @Override 104 public int delete(int id) { 105 conn1 = UnitMysql.getConnection(); 106 int i = 0; 107 try { 108 String sqlDelete = "delete from users where id=?"; 109 ps = conn1.prepareStatement(sqlDelete); 110 ps.setInt(1, id); 111 i = ps.executeUpdate(); 112 if (i == 1) { 113 return i; 114 } 115 } catch (SQLException e) { 116 e.printStackTrace(); 117 } finally { 118 UnitMysql.Close(null, ps, conn1); 119 } 120 return i; 121 } 122 123 // 查询一条数据通过ID 124 @Override 125 public Tb_User queryDataById(int id) { 126 conn1 = UnitMysql.getConnection(); 127 String sql = "select * from users where id=?"; 128 Tb_User user = null; 129 if (id > 0) { 130 try { 131 ps = conn1.prepareStatement(sql); 132 ps.setInt(1, id); 133 rs = ps.executeQuery(); 134 if (rs.next()) { 135 user = new Tb_User(); 136 user.setId(rs.getInt("id")); 137 user.setName(rs.getString("name")); 138 user.setPassword(rs.getString("password")); 139 user.setBirthday(rs.getDate("birthday")); 140 user.setSex(rs.getBoolean("sex")); 141 142 } 143 } catch (SQLException e) { 144 e.printStackTrace(); 145 } finally { 146 UnitMysql.Close(null, ps, conn1); 147 } 148 } 149 return user; 150 } 151 152 }
5. 业务处理层(service,service.imp)
- .service层
在zhu.jdbc.service包下创建一个ITb_UserService 类
ITb_UserService 如下:
1 package zhu.jdbc.service; 2 3 import zhu.jdbc.command.IServiceCommand; 4 import zhu.jdbc.domain.Tb_User; 5 6 7 public interface ITb_UserService extends IServiceCommand<Tb_User> { 8 //这里与dao层的中的ITb_User.java是一样的意思 9 }
1.1 这里继承的 IServiceCommand 类是在zhu.jdbc.command下 创建一个IServiceCommand的类
代码IServiceCommand 如下:
1 package zhu.jdbc.command; 2 3 import java.util.List; 4 5 6 public interface IServiceCommand<T> { 7 //查询所有的数据 8 public List<T> queryAllData(); 9 //新增数据 10 public boolean insertData(T t); 11 //修改数据 12 public boolean update(T t); 13 //删除数据 14 public boolean delete(int id); 15 //查询一条数据通过ID 16 public T queryDataById(int id); 17 }
2. service.imp层
//这里的 service层要想与 dao层(BAL层逻辑层)建立联系那么必须要 创建 dao层的对象
在zhu.jdbc.service.imp包下创建一个ITb_UserServiceImpI 类
ITb_UserServiceImpI 代码如下:
1 package zhu.jdbc.service.imp; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.util.List; 7 8 import zhu.jdbc.dao.ITb_User; 9 import zhu.jdbc.dao.imp.ITb_UserImpI; 10 import zhu.jdbc.domain.Tb_User; 11 import zhu.jdbc.service.ITb_UserService; 12 /** 13 * 链接与dao层的链接 14 * @author Xiao_Zhu 15 * 16 */ 17 public class ITb_UserServiceImpI implements ITb_UserService{ 18 public Connection conn1 = null; 19 public ResultSet rs = null; 20 public PreparedStatement ps = null; 21 boolean b=false; 22 //这里的 service层要想玉 dao层(BAL层逻辑层)建立联系那么必须要 创建 dao层的对象 23 ITb_User myiTb_User=new ITb_UserImpI();//创建了 dao层的ITb_UserImp对象 24 25 //查询所有数据 26 @Override 27 public List<Tb_User> queryAllData() { 28 29 return myiTb_User.queryAllData(); 30 } 31 32 //新增 33 @Override 34 public boolean insertData(Tb_User t) { 35 if (t!=null) { myiTb_User.insertData(t); 38 b=true; 39 } 41 return b; 42 } 43 44 //修改 45 @Override 46 public boolean update(Tb_User t) { 47 if (t!=null) { 48 myiTb_User.update(t); 50 b=true; 51 } 53 return b; 54 } 55 //删除 56 @Override 57 public boolean delete(int id) { 58 if (id!=0) { 59 myiTb_User.delete(id); 60 b=true; 61 } 62 return b; 63 } 64 //查询一条数据 65 @Override 66 public Tb_User queryDataById(int id) { 67 if (id!=0) { 68 return myiTb_User.queryDataById(id); 69 } 70 else { 71 return null; 72 } 73 } 74 75 }
6. Web层(相当于界面层)
在zhu.jdbc.servlet包下创建一个Servlet_TbUser 类
创建的Servlet_TbUser类要在web配置
web的配置内容如下:
1 2 <!--Servlet_TbUser.java的配置--> 3 <servlet> 4 <servlet-name>Servlet_TbUser</servlet-name> 5 <servlet-class>zhu.jdbc.servlet.Servlet_TbUser</servlet-class> 6 </servlet> 7 <servlet-mapping> 8 <servlet-name>Servlet_TbUser</servlet-name> 9 <url-pattern>/zhu/Servlet_TbUser</url-pattern> 10 </servlet-mapping>
Servlet_TbUser 代码如下:
1 package zhu.jdbc.servlet; 2 3 import java.io.IOException; 4 import java.sql.Date; 5 import java.text.ParseException; 6 import java.text.SimpleDateFormat; 7 import java.util.List; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import zhu.jdbc.domain.Tb_User; 15 import zhu.jdbc.service.ITb_UserService; 16 import zhu.jdbc.service.imp.ITb_UserServiceImpI; 17 18 public class Servlet_TbUser extends HttpServlet { 19 20 /** 21 * 22 */ 23 private static final long serialVersionUID = 1L; 24 25 //这里建立 与service层的 联系 创建一个service层imp的某个的对 26 ITb_UserService myITb_UserService=new ITb_UserServiceImpI(); 27 28 @Override 29 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 30 throws ServletException, IOException { 31 doPost(req, resp); 32 } 33 34 @Override 35 protected void doPost(HttpServletRequest request, HttpServletResponse response) 36 throws ServletException, IOException { 37 request.setCharacterEncoding("UTF-8");//解决乱码 38 String type=request.getParameter("who"); 39 //新增 40 if("Insert".equals(type)){ 41 Insert(request, response); 42 } 43 else if("update".equals(type)){ 44 update(request, response); 45 } 46 else if("queryById".equals(type)){ 47 queryById(request, response); 48 } 49 else if("delete".equals(type)){ 50 delete(request, response); 51 } 52 else if("queryAll".equals(type)){ 53 queryAll(request, response); 54 } 55 } 56 //新增 57 public void Insert(HttpServletRequest request, HttpServletResponse response) 58 throws ServletException, IOException { 59 //这里jsp中name专递过来的参数 60 String name=request.getParameter("name"); 61 String birthday=request.getParameter("birthday"); 62 String password=request.getParameter("password"); 63 String email=request.getParameter("email"); 64 String sex=request.getParameter("sex"); 65 //把获取到的这些值放到user里 66 Tb_User user =new Tb_User(); 67 68 try { 69 //下面两句是把 string 转换为 sql类型的 时间格式 70 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); 71 user.setBirthday(new Date(sdf.parse(birthday).getTime())); 72 } catch (ParseException e1) { 73 e1.printStackTrace(); 74 } 75 76 user.setEmail(email); 77 user.setName(name) ; 78 user.setPassword(password); 79 if ("1".equals(sex)) { 80 user.setSex(true); 81 } 82 else if ("0".equals(sex)) { 83 user.setSex(false); 84 } 85 //最后调用服务来添加 86 String message=null; 87 if (myITb_UserService.insertData(user)==true) { 88 queryAll(request, response); 89 } 90 else { 91 message="新增失败!!!"; 92 request.setAttribute("msg", message); 93 request.getRequestDispatcher("/index.jsp").forward(request, response); 94 } 95 96 97 } 98 //修改 99 public void update(HttpServletRequest request, HttpServletResponse response) 100 throws ServletException, IOException { 101 String name=request.getParameter("name"); 102 String birthday=request.getParameter("birthday"); 103 String password=request.getParameter("password"); 104 // String email=request.getParameter("email"); 105 String sex=request.getParameter("sex"); 106 String id=request.getParameter("id"); 107 //把获取到的这些值放到user里 108 Tb_User user =new Tb_User(); 109 try { 110 //下面两句是把 string 转换为 sql类型的 时间格式 111 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); 112 user.setBirthday(new Date(sdf.parse(birthday).getTime())); 113 } catch (ParseException e1) { 114 e1.printStackTrace(); 115 } 116 user.setId(Integer.parseInt(id)); 117 // user.setEmail(email); 118 user.setName(name) ; 119 user.setPassword(password); 120 if ("1".equals(sex)) { 121 user.setSex(true); 122 } 123 else if ("0".equals(sex)) { 124 user.setSex(false); 125 } 126 boolean b= myITb_UserService.update(user); 127 if (b==true) { 128 queryAll(request, response); 129 } 130 else { 131 request.setAttribute("msg", "修改失败!!"); 132 request.getRequestDispatcher("/index.jsp").forward(request, response); 133 } 134 135 } 136 //查询一条数据 137 public void queryById(HttpServletRequest request, HttpServletResponse response) 138 throws ServletException, IOException { 139 Tb_User user=null; 140 String id= request.getParameter("id"); 141 System.out.println(id); 142 user= myITb_UserService.queryDataById(Integer.parseInt(id) ); 143 request.setAttribute("user", user); 144 request.getRequestDispatcher("/jsp/User.jsp").forward(request, response); 145 } 146 //删除 147 public void delete(HttpServletRequest request, HttpServletResponse response) 148 throws ServletException, IOException { 149 String id= request.getParameter("id"); 150 System.out.println(id); 151 boolean message=myITb_UserService.delete(Integer.parseInt(id)); 152 if (message==true) { 153 queryAll(request, response); 154 } 155 else { 156 157 request.setAttribute("msg", "删除失败!!"); 158 request.getRequestDispatcher("/index.jsp").forward(request, response); 159 } 160 } 161 //查询所有的数据 162 public void queryAll(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ 163 List<Tb_User> lis=myITb_UserService.queryAllData(); 164 request.setAttribute("list", lis); 165 request.getRequestDispatcher("/jsp/User.jsp").forward(request, response); 166 } 167 168 }
三、创建jsp
User的代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme() + "://" 5 + request.getServerName() + ":" + request.getServerPort() 6 + path + "/"; 7 %> 8 <!-- c标签要使用,那么就必须要有它 --> 9 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 10 <c:set scope="page" var="url" 11 value="${pageContext.request.contextPath }"></c:set> 12 13 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 14 <html> 15 <head> 16 <base href="<%=basePath%>"> 17 18 <title>新增用户</title> 19 20 <meta http-equiv="pragma" content="no-cache"> 21 <meta http-equiv="cache-control" content="no-cache"> 22 <meta http-equiv="expires" content="0"> 23 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 24 <meta http-equiv="description" content="This is my page"> 25 26 27 </head> 28 29 <body> 30 <div align="center" 31 style=" 400px; position: relative;left:450px"> 32 <form action="${url}/zhu/Servlet_TbUser?who=Insert" method="post"> 33 <h4>新增用户</h4> 34 姓名: <input type="text" name="name"><br /> 35 密码: <input type="text" name="password"><br /> 36 出生日期 : <input type="text" name="birthday"><br /> 37 性别: <select name="sex"> 38 <option value="0">男</option> 39 <option value="1">女</option> 40 </select><br /> 41 <input type="submit" value="新增"/> 42 <hr /> 43 </form> 44 </div> 45 <div align="center"style=" 400px; position: relative;left:450px;"> 46 <form action="${url}/zhu/Servlet_TbUser?who=queryAll" method="post"> 47 <input type="submit" value="查询所有的数据"/> <br/> 48 <table border="1" cellspacing="0"> 49 <thead> 50 <tr><td>ID</td><td>姓名</td><td>密码</td><td>日期</td><td>性别</td><td>操作</td></tr> 51 </thead> 52 <tbody> 53 <c:forEach items="${list}" var="list"> 54 <tr> 55 <td>${list.id }</td> 56 <td>${list.name }</td> 57 <td>${list.password }</td> 58 <td>${list.birthday }</td> 59 <td><c:if test="${list.sex==false }">男</c:if> 60 <c:if test="${list.sex==true }">女</c:if></td> 61 <td><a href= "${url}/zhu/Servlet_TbUser?who=queryById&id=${list.id}" style='text-decoration:none' onclick='update(this)' >修改 </a> 62 <a href= "${url}/zhu/Servlet_TbUser?who=delete&id=${list.id}" style='text-decoration:none' >删除</a> </td> 63 </tr> 64 </c:forEach> 65 </tbody> 66 </table> 67 <hr /> 68 </form> 69 </div> 70 <div align="center" 71 style=" 400px; position: relative;left:450px"> 72 <form action="${url}/zhu/Servlet_TbUser?who=update" method="post"> 73 <h4>修改用户</h4> 74 <input type="hidden"name="id" value="${user.id }"/> 75 姓名: <input type="text" name="name" value="${user.name }"><br /> 76 密码: <input type="text" name="password" value="${user.password }"><br /> 77 出生日期 : <input type="text" name="birthday" value="${user.birthday }"><br /> 78 性别:<c:if test="${user.sex==false }"> 79 <select name="sex" > 80 <option value="0">男</option> 81 <option value="1">女</option> 82 </select> 83 </c:if> 84 <c:if test="${user.sex==true }"> 85 <select name="sex" > 86 <option value="1">女</option> 87 <option value="0">男</option> 88 </select> 89 </c:if><br /> 90 <input type="submit" value="保存修改"/> 91 <hr /> 92 </form> 93 </div> 94 </body> 95 </html>
index.jsp代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'index.jsp' starting page</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 <h1>${msg }</h1> <br> 25 </body> 26 </html>
四、运行效果:
源码下载地址: https://pan.baidu.com/s/1bQKEAi