一。javeEE的项目结构层次:MVC
1.Model:模型层(DAO+业务层)
2.View:视图层 jsp
3.Control:控制层 servlet
二。分层的原则:
1.层与层之间松耦合,层内保持高内聚性
2.不跨层访问
3.层与层之间的访问是通过接口来调用
4.上层调用下层,不能反过来
注意:关于页面中写路径的问题:
将页面中加入:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head> <base href="<%=basePath%>"/></head>这句话的作用是将当前网页中的所有连接属性加上了完整路径的前缀。
好处:就是页面的所有路径都从根目录开始写起,包括css,js,img,action,超链接
为了方便页面的编辑,可以将eclipse中的jsp模板修改:点击window--preference--web--jsp files--editor--templates
在右边的列表中找到New Jsp file(html)--点击editor--修改模板--apply
实例:用MVC的结构实现一个学生系统的增删改查
后台代码结构(srccom目录下、srccomcontrol目录下)+前端代码结构(WebContentstudent目录下)
其他代码就不贴出,仅贴出control层+jsp层
QueryStudentServlet.java
package com.control; 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 com.pojo.Student; import com.service.IStudentService; import com.service.StudentService; @WebServlet("/queryStu") public class QueryStudentServlet extends HttpServlet{ IStudentService stuSer = new StudentService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.调用业务查询数据 List<Student> list = stuSer.getAllStu(); //2.将数据保存到request中传递到页面 req.setAttribute("list", list); //3.转发页面 req.getRequestDispatcher("student/listStudent.jsp").forward(req, resp); } }
AddStudentServlet.java
package com.control; import java.io.IOException; 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 com.service.IStudentService; import com.service.StudentService; @WebServlet("/stu") public class AddStudentServlet extends HttpServlet{ IStudentService stuSer = new StudentService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); //1.获取页面的参数 String stuname = req.getParameter("stuname"); String stusex = req.getParameter("stusex"); String stuage = req.getParameter("stuage"); String studate = req.getParameter("studate"); String stuprofess = req.getParameter("stuprofess"); //2.调用业务层保存数据 int result = stuSer.addStu(stuname, stusex, stuage, studate, stuprofess); //3.跳转页面 if(result==1){//成功 req.setAttribute("mess", "添加成功!"); }else{ req.setAttribute("mess", "添加失败!"); } req.getRequestDispatcher("student/addStudent.jsp").forward(req, resp); } }
UpdateStudentServlet.java
package com.control; import java.io.IOException; 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 com.pojo.Student; import com.service.IStudentService; import com.service.StudentService; @WebServlet("/updateStu") public class UpdateStudentServlet extends HttpServlet{ IStudentService stuSer = new StudentService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String type = req.getParameter("type"); if("del".equals(type)){//删除学员信息 String id = req.getParameter("id"); stuSer.delStu(id); //删除数据后重定向到查询的servlet中去完成查询 resp.sendRedirect("queryStu"); return;//一个请求中只能有一次跳转,所有每个if结束都要return } if("toupdate".equals(type)){//查询单个学员跳转到修改页面 String id = req.getParameter("id"); Student stu = stuSer.getStuById(id); req.setAttribute("stu", stu); //查询出要修改的学员信息传到页面去展示以便修改 req.getRequestDispatcher("student/updateStudent.jsp").forward(req, resp); return; } if("update".equals(type)){//修改学员信息 //1.获取页面的参数 String stuid = req.getParameter("stuid"); String stuname = req.getParameter("stuname"); String stusex = req.getParameter("stusex"); String stuage = req.getParameter("stuage"); String studate = req.getParameter("studate"); String stuprofess = req.getParameter("stuprofess"); //2.调用业务层修改数据 stuSer.updateStu(stuid, stuname, stusex, stuage, studate, stuprofess); //3.跳转查询页面 刷新页面数据 resp.sendRedirect("queryStu"); return; } } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <div style="height: 90px; 1200px;float: left;"> <iframe src="student/top.jsp" style=" 100%;border: 0"></iframe> </div> <div style="float: left;height: 700px;200px;"> <iframe src="student/left.jsp" style="border: 0" height="700px"></iframe> </div> <div style="float: left;height: 700px;1100px;"> <iframe name="main_" src="student/main.jsp" style="border: 0" height="700px" width="1100px"></iframe> </div> </body> </html>
top.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <img src="img/logo.gif" width="100%" height="90px"> </body> </html>
left.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <div> <a href="student/addStudent.jsp" target="main_">新增学员信息</a> <p><a href="queryStu" target="main_">查询学员信息</a></p> </div> </body> </html>
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <div align="center"> <h1>欢迎使用学员管理系统</h1> </div> </body> </html>
list.jsp
<%@page import="com.pojo.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style type="text/css"> </style> </head> <script type="text/javascript"> function del(id){ if(confirm("是否确定要删除该数据?")){ window.location.href="updateStu?type=del&id="+id; } } </script> <% List<Student> list = (List)request.getAttribute("list"); %> <body> <div align="center"> <table style=" 500px;" border="1"> <tr> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>生日</th> <th>专业</th> <th>操作</th> </tr> <% if(list!=null) for(Student stu:list){ %> <tr> <td><%=stu.getStuId() %></td> <td><%=stu.getStuName() %></td> <td><%=stu.getStuAge() %></td> <td><%=stu.showStuSex() %></td> <td><%=stu.showStuDate() %></td> <td><%=stu.showStuProfess() %></td> <td><a href="javascript:del('<%=stu.getStuId() %>')">删除</a> <a href="updateStu?type=toupdate&id=<%=stu.getStuId() %>">修改</a></td> </tr> <% } %> </table> </div> </body> </html>
addStudent.jsp
<%@page import="java.sql.PseudoColumnUsage"%> <%@page import="com.util.Profession"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <% //用枚举来维护专业下拉列表 Profession[] ps = Profession.values();//拿到枚举中的所有类型 String mess = (String)request.getAttribute("mess"); if(mess==null){ mess= ""; } %> <body> <div align="center"> <h1>新增学员信息</h1> <form action="stu" method="post"> <table style=" 500px;"> <tr> <td align="right">学员姓名:</td> <td><input name="stuname"></td> </tr> <tr> <td align="right">学员性别:</td> <td> 男<input checked="checked" type="radio" name="stusex" value="1"> 女<input type="radio" name="stusex" value="2"> </td> </tr> <tr> <td align="right">学员年龄:</td> <td><input name="stuage"></td> </tr> <tr> <td align="right">生日:</td> <td><input type="date" name="studate"></td> </tr> <tr> <td align="right">专业:</td> <td> <select name="stuprofess"> <%for(int i=0;i<ps.length;i++){ Profession p = ps[i]; %> <option value="<%=p.getValue()%>"><%=p.getName() %></option> <%} %> </select> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="提交"><span style="color: red"><%=mess %></span> </td> </tr> </table> </form> </div> </body> </html>
updateStudeng.java
<%@page import="com.pojo.Student"%> <%@page import="com.util.Profession"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <% //用枚举来维护专业下拉列表 Profession[] ps = Profession.values();//拿到枚举中的所有类型 String mess = (String)request.getAttribute("mess"); if(mess==null){ mess= ""; } Student stu = (Student)request.getAttribute("stu"); %> <body> <div align="center"> <h1>修改学员信息</h1> <form action="updateStu?type=update" method="post"> <input type="hidden" name="stuid" value="<%=stu.getStuId()%>"> <table style=" 500px;"> <tr> <td align="right">学员姓名:</td> <td><input name="stuname" value="<%=stu.getStuName()%>"></td> </tr> <tr> <td align="right">学员性别:</td> <td> <% if("1".equals(stu.getStuSex())){ %> 男<input checked="checked" type="radio" name="stusex" value="1"> 女<input type="radio" name="stusex" value="2"> <% }else{ %> 男<input type="radio" name="stusex" value="1"> 女<input checked="checked" type="radio" name="stusex" value="2"> <% } %> </td> </tr> <tr> <td align="right">学员年龄:</td> <td><input name="stuage" value="<%=stu.getStuAge()%>"></td> </tr> <tr> <td align="right">生日:</td> <td><input type="date" name="studate" value="<%=stu.showStuDate()%>"></td> </tr> <tr> <td align="right">专业:</td> <td> <select name="stuprofess"> <%for(int i=0;i<ps.length;i++){ Profession p = ps[i]; if(stu.getStuProfess().equals(p.getValue()+"")){ %> <option value="<%=p.getValue()%>" selected="selected"><%=p.getName() %></option> <%}else{%> <option value="<%=p.getValue()%>"><%=p.getName() %></option> <%} } %> </select> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="提交"><span style="color: red"><%=mess %></span> </td> </tr> </table> </form> </div> </body> </html>
<%@page import="com.pojo.Student"%> <%@page import="com.util.Profession"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <head> <base href="<%=basePath%>"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <% //用枚举来维护专业下拉列表 Profession[] ps = Profession.values();//拿到枚举中的所有类型 String mess = (String)request.getAttribute("mess"); if(mess==null){ mess= ""; } Student stu = (Student)request.getAttribute("stu"); %> <body> <div align="center"> <h1>修改学员信息</h1> <form action="updateStu?type=update" method="post"> <input type="hidden" name="stuid" value="<%=stu.getStuId()%>"> <table style=" 500px;"> <tr> <td align="right">学员姓名:</td> <td><input name="stuname" value="<%=stu.getStuName()%>"></td> </tr> <tr> <td align="right">学员性别:</td> <td> <% if("1".equals(stu.getStuSex())){ %> 男<input checked="checked" type="radio" name="stusex" value="1"> 女<input type="radio" name="stusex" value="2"> <% }else{ %> 男<input type="radio" name="stusex" value="1"> 女<input checked="checked" type="radio" name="stusex" value="2"> <% } %> </td> </tr> <tr> <td align="right">学员年龄:</td> <td><input name="stuage" value="<%=stu.getStuAge()%>"></td> </tr> <tr> <td align="right">生日:</td> <td><input type="date" name="studate" value="<%=stu.showStuDate()%>"></td> </tr> <tr> <td align="right">专业:</td> <td> <select name="stuprofess"> <%for(int i=0;i<ps.length;i++){ Profession p = ps[i]; if(stu.getStuProfess().equals(p.getValue()+"")){ %> <option value="<%=p.getValue()%>" selected="selected"><%=p.getName() %></option> <%}else{%> <option value="<%=p.getValue()%>"><%=p.getName() %></option> <%} } %> </select> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="提交"><span style="color: red"><%=mess %></span> </td> </tr> </table> </form> </div> </body> </html>
Profession.java
package com.util;
public enum Profession {
YUWEN(1),SHUXUE(2),YINGYU(3),SHENGWU(4),TIYU(5);
Profession(int v){
this.value = v;
}
Profession(){
}
String name;
int value;
public String getName() {
if(value==1){
return "语文";
}else if(value==2){
return "数学";
}else if(value==3){
return "英语";
}else if(value==4){
return "生物";
}else if(value==5){
return "体育";
}
return "";
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Profession getProfessionByValue(int value){
for (Profession p : Profession.values()) {
if(p.getValue()==value){
return p;
}
}
return null;
}
}