目录
service包——作为连接servlet和dao层的包——StudentService
service包——StudentService实现类StudentServiceImpl
util工具类包——前后端文字编码设置类ServletEncoding
web包(servlet类)——删除功能服务器DeleteServlet
web包——查询功能服务GetAllStudentServlet
JavaWEB MVC
写Java Web项目时会发现,一个中型或者大型项目 随着代码的增多,会发现:代码既可以写在src目录下,也可以
写在WebContent目录下。src下可以建很多包 ,WebContent下可以建很多文件夹。
所以问题就来了:一个新的类 到底往哪个目录下的哪个文件夹里写?
此时解决办法就是:需要一个模式去规范,到底哪个类该往哪里写。
1.MVC设计模式
Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念一样,我们再看一下Web MVC标准架构,如下图所示:
在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请求(即请求-响应模型)。
M:(Model) 模型 : 应用程序的核心功能,管理这个模块中用的数据和值(bean,dao);
JavaBeans :是Java中一种特殊的类(换言之:JavaBean就是一个Java类).
一个Java类 ,满足以下要求,则可称为一个JavaBean
a. public修饰的类,提供public 无参构造方法
b. 所有属性 都是private
C. 提供getter和setter方法
从使用层面来看,JavaBean分为2大类:
a. 封装业务逻辑的JavaBean(eg:LoginDao.java 封装了登录逻辑)
b. 封装数据的JavaBean(实体类:eg:Student.java Vadio.java 。往往对应于数据库中的一张表,即数据库中有个Student表,项目中就有个Student.java类)通常:表名=类名,列名=属性名
JavaBean是一个可以重复使用的组件,通过编写一个组件来实现某种通用功能,“一次编写、任何地方执行、任何地方重用”。
V(View )视图: 视图提供模型的展示,管理模型如何显示给用户,它是应用程序的外观;(jsp/html)
C(Controller)控制器: 对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽。
(servlet/service)
MVC用于将web(UI)层进行职责解耦
说明:mvc设计模式(不属于23种设计模式)
2.三层架构
三层架构 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 jsp/html
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 servlet,service
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。dao
表现层实现的代表作品是Struts,springmvc框架,
业务层实现的代表作品是Spring,
数据层实现的代表作品是Hibernate,mybatis。
层就相当于一个黑盒子,我们不用知道它内部怎么实现,只需要知道如何去调用它就行了。每层只与上下相邻的两层打交道。当一层内部由于技术变迁发生变化时,只要接口不变,其他层不用做任何改变。分层之后灵活性提高,也便于团队分工开发。
3.三层架构和MVC的区别与联系
MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。
MVC可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存。
三层是基于业务逻辑来分的,而MVC是基于页面来分的。
MVC主要用于表现层,3层主要用于体系架构,3层一般是表现层、中间层、数据层,其中表现层又可以分成M、V、C,(Model View Controller)模型-视图-控制器
MVC是表现模式(Presentation Pattern)
三层架构是典型的架构模式(Architecture Pattern)
三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技 术。
注意
1.先写实体类,再写接口,最后写实现类
2.servlet调用service,service调用dao。
3.service是用来实现复杂逻辑的,具体的就是调用dao层的方法,同样需要用到dao的接口。
MVC固定包框架
前后端分离
作业
MVC部分
bean包——student实体类
public class Student {
private int studentId;
private String studentNo;
private String stuName;
private int stuAge;
private int gradeId;
public Student() {
}
public Student(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
this.studentId = studentId;
this.studentNo = studentNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.gradeId = gradeId;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public int getGradeId() {
return gradeId;
}
public void setGradeId(int gradeId) {
this.gradeId = gradeId;
}
@Override
public String toString() {
return "Student{" +
"studentId=" + studentId +
", studentNo='" + studentNo + '\'' +
", stuName='" + stuName + '\'' +
", stuAge=" + stuAge +
", gradeId=" + gradeId +
'}';
}
}
dao包——增删改查接口StudentDao
public interface StudentService {
public List<Student> getAll();
public boolean delete(int studentId);
public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
}
dao包——增删改查接口实现类StudentDaoImpl
public class StudentDaoImpl extends DruidUtil implements StudentDao {
List list = new ArrayList();
Connection connection = null;
PreparedStatement preparedStatement= null;
ResultSet resultSet = null;
Statement statement;
@Override
public List<Student> getAll() {
try {
connection = getConnection();
String sql = "select * from student";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
Student student = new Student();
student.setStudentId(resultSet.getInt("studentid"));
student.setStudentNo(resultSet.getString("studentno"));
student.setStuName(resultSet.getString("stuname"));
student.setStuAge(resultSet.getInt("stuage"));
student.setGradeId(resultSet.getInt("gradeid"));
list.add(student);
}
} catch (SQLException throwable) {
throwable.printStackTrace();
}finally {
close(connection,preparedStatement,resultSet);
}
return list;
}
@Override
public boolean delete(int studentId) {
try {
connection =getConnection();
String sql = "delete from student where studentid = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,studentId);
int i = preparedStatement.executeUpdate();
if (i>0) {
return true;
}
} catch (SQLException throwable) {
throwable.printStackTrace();
}finally {
close(connection,preparedStatement);
}
return false;
}
@Override
public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId) {
try {
connection = getConnection();
String sql = "insert into student values(?,?,?,?,?);";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, studentId);
preparedStatement.setString(2, studentNo);
preparedStatement.setString(3, stuName);
preparedStatement.setInt(4, stuAge);
preparedStatement.setInt(5, gradeId);
int i = preparedStatement.executeUpdate();
if (i>0) {
return true;
}
} catch (SQLException throwable) {
throwable.printStackTrace();
}finally {
close(connection,preparedStatement);
}
return false;
}
@Override
public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId) {
try {
connection = getConnection();
String sql = "select * from student";
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
while (resultSet.next()){
int sid = resultSet.getInt("studentId");
if (sid==studentId){
String sql2 = "UPDATE student SET studentno = ?,stuname =?,stuage =?,gradeid =? WHERE studentid=?;";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.setString(1, studentNo);
preparedStatement.setString(2, stuName);
preparedStatement.setInt(3, stuAge);
preparedStatement.setInt(4, gradeId);
preparedStatement.setInt(5, studentId);
int i = preparedStatement.executeUpdate();
if (i>0){
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
close(connection,statement,preparedStatement,resultSet);
}
return false;
}
}
service包——作为连接servlet和dao层的包——StudentService
public interface StudentService {
public List<Student> getAll();
public boolean delete(int studentId);
public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
}
service包——StudentService实现类StudentServiceImpl
public class StudentServiceImpl implements StudentService {
private StudentDao dao = new StudentDaoImpl();
@Override
public List<Student> getAll() {
return dao.getAll();
}
@Override
public boolean delete(int studentId) {
return dao.delete(studentId);
}
@Override
public boolean update(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
return dao.update(studentId,studentNo,stuName,stuAge,gradeId);
}
@Override
public boolean insert(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
return dao.insert(studentId,studentNo,stuName,stuAge,gradeId);
}
}
util工具类包——德鲁伊JDBC连接池DruidUtil
public class DruidUtil {
private static DataSource ds;
static {
try {
Properties ppt = new Properties();
ppt.load(util.DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(ppt);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从连接池中取出一个连接给用户
*
* @return
*/
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void close(Connection conn, Statement state, ResultSet rs) {
try {
rs.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
state.close();
} catch (Exception throwable) {
throwable.printStackTrace();
}
try {
conn.close();
} catch (Exception throwable) {
throwable.printStackTrace();
}
}
public static void close(Connection conn, Statement state) {
try {
state.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
conn.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
public static void close(Connection conn, Statement state, PreparedStatement preState, ResultSet rs) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
state.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
preState.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
util工具类包——前后端文字编码设置类ServletEncoding
public class ServletEncoding extends HttpServlet {
public void enCoding(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接收参数的编码和发送内容的编码
//接收参数的编码
req.setCharacterEncoding("utf-8");
//发送内容的编码
resp.setCharacterEncoding("utf-8");
// 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
resp.setContentType("text/html;charset=utf-8;");
}
}
注意:设置编码方式也可以用过滤器对所有网页进行过滤来实现
过滤器实现前后端设置编码方式
@WebServlet(/*)
public class CharactorFilter implements Filter { //继承Filter类
//字符编码
String encoding=null;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding!=null){
//设置request字符编码
request.setCharacterEncoding(encoding);
//设置response字符编码
response.setContentType("text/html;charset="+encoding);
}
//传递给下一个过滤器
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
//获取初始化参数
encoding=filterConfig.getInitParameter("encoding");
}
public void destroy() {
// TODO Auto-generated method stub
encoding=null;
}
}
web包(servlet类)——删除功能服务器DeleteServlet
@WebServlet(value = "/delete")
public class DeleteServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接收参数的编码和发送内容的编码
ServletEncoding servletEncoding = new ServletEncoding();
servletEncoding.enCoding(req,resp);
//接收参数
String sid = req.getParameter("studentId");
System.out.println(sid);
int studentId = Integer.parseInt(sid);
//调取service方法
StudentService studentService = new StudentServiceImpl();
PrintWriter writer = resp.getWriter();
boolean delete = studentService.delete(studentId);
if (delete){
System.out.println("删除成功");
writer.print("<script type=\"text/javascript\">alert('删除成功,正在返回主页面'); location.href='/index.jsp'</script>");
}else{
writer.print("<script>alert('输入的信息有误');location.href='/delete.jsp'</script>");
}
writer.close();
}
}
web包——查询功能服务GetAllStudentServlet
@WebServlet(value = "/getAllStudent")
public class GetAllStudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接收参数
//2.调取service方法
StudentService studentService = new StudentServiceImpl();
List<Student> students = studentService.getAll();
//3.跳转页面
req.setAttribute("students",students);
req.getRequestDispatcher("show.jsp").forward(req,resp);
}
}
web包——增加功能服务器InsertServlet
@WebServlet(value = "/insert")
public class InsertServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接收参数的编码和发送内容的编码
//设置接收参数的编码和发送内容的编码
ServletEncoding servletEncoding = new ServletEncoding();
servletEncoding.enCoding(req,resp);
//接收参数
int studentId = Integer.parseInt(req.getParameter("studentId"));
String studentNo = req.getParameter("studentNo");
String stuName = req.getParameter("stuName");
int stuAge = Integer.parseInt(req.getParameter("stuAge"));
int gradeId = Integer.parseInt(req.getParameter("gradeId"));
//调取service方法
StudentService studentService = new StudentServiceImpl();
PrintWriter writer = resp.getWriter();
Boolean insert = studentService.insert(studentId,studentNo,stuName,stuAge,gradeId);
if (insert){
writer.write("<script type=\"text/javascript\">alert('新增成功,正在返回主页面'); location.href='/index.jsp'</script>");
}else{
writer.write("<script type=\"text/javascript\">alert('新增失败,正在返回新增页面'); location.href='/insert.jsp'</script>");
}
writer.close();
}
}
web包——修改功能服务器UpdateServlet
@WebServlet(value = "/update")
public class UpdateServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接收参数的编码和发送内容的编码
//设置接收参数的编码和发送内容的编码
ServletEncoding servletEncoding = new ServletEncoding();
servletEncoding.enCoding(req,resp);
//接收参数
int studentId = Integer.parseInt(req.getParameter("studentId"));
String studentNo = req.getParameter("studentNo");
String stuName = req.getParameter("stuName");
int stuAge = Integer.parseInt(req.getParameter("stuAge"));
int gradeId = Integer.parseInt(req.getParameter("gradeId"));
//调取service方法
StudentService studentService = new StudentServiceImpl();
PrintWriter writer = resp.getWriter();
Boolean update = studentService.update(studentId,studentNo,stuName,stuAge,gradeId);
if (update){
writer.write("<script type=\"text/javascript\">alert('修改成功,正在返回主页面'); location.href='/index.jsp'</script>");
}else{
writer.write("<script type=\"text/javascript\">alert('修改失败,正在返回修改页面'); location.href='/index.jsp'</script>");
}
writer.close();
}
}
前端部分
主页面——index.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/insert">
请输入要增加的学生信息:<br><br>
id:<input type="text" name="studentId"><br><br>
编号:<input type="text" name="studentNo"><br><br>
姓名:<input type="text" name="stuName"><br><br>
年龄:<input type="text" name="stuAge"><br><br>
班级:<input type="text" name="gradeId"><br><br>
<input type="submit" value="增加">
</form>
</body>
查询信息页面——show.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>show.jsp</h1>
<table border="1" cellspacing="0" width="800px">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生年龄</td>
<td>学生班级</td>
</tr>
<c:forEach items="${students}" var="stu">
<tr>
<td>${stu.studentNo}</td>
<td>${stu.stuName}</td>
<td>${stu.stuAge}</td>
<td>${stu.gradeId}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
新增信息页面——insert.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/insert">
请输入要增加的学生信息:<br><br>
id:<input type="text" name="studentId"><br><br>
编号:<input type="text" name="studentNo"><br><br>
姓名:<input type="text" name="stuName"><br><br>
年龄:<input type="text" name="stuAge"><br><br>
班级:<input type="text" name="gradeId"><br><br>
<input type="submit" value="增加">
</form>
</body>
</html>
删除信息页面——delete.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="delect" action="/delete">
请输入要删除的学生id:<input type="text" name="studentId">
<input type="submit" value="删除">
</form>
</body>
</html>
修改信息页面——update.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/update">
请输入要修改信息的的学生id:<input type="text" name="studentId"><br><br>
请输入修改后的信息:<br>
编号:<input type="text" name="studentNo"><br><br>
姓名:<input type="text" name="stuName"><br><br>
年龄:<input type="text" name="stuAge"><br><br>
班级:<input type="text" name="gradeId"><br>
<input type="submit" value="修改">
</form>
</body>
</html>