一、复习
Servlet概述
开发我们的第一个Servlet(手工创建)
HttpServlet的创建(工具创建)
Servlet工作原理
Servlet获取参数代码示例
Servlet概述
开发我们的第一个Servlet(手工创建)
HttpServlet的创建(工具创建)
Servlet工作原理
Servlet获取参数代码示例
二、新内容 Servlet用户登录实例 javax.servlet包和javax.servlet.http包
1、MVC模式介绍,为什么要使用模式?Model模型层-View视图层-Control控制层
因为模式是一种指导,在一个良好的指导下,有助于你完成任务,
有助于你作出一个优良的设计方案,达到事半功倍的效果。
而且会得到解决问题的最佳办法。 设计模式的目标就是
提高系统的可维护性和可复用性。
(私人承包的建筑队伍和中国建设集团的区别,参考图片)
M odel : entity实体类 表示一个表的数据模型User.java
V iew : JSP 收集数据、事件处理、展示数据
C ontrol: Servlet 控制跳转
在J2EE中,一般由jsp扮演View层、Servlet扮演Control层、java撰写Model层。
JSP 仅能作为表现层(View)技术,作用有三点:
1. 负责收集用户请求参数。2. 用户事件的处理。3、状态数据呈现给用户。
Servlet 则仅充当控制器(Controller)角色,用户类似于调度员:(所以用户的请求发送给 Servlet , Servlet 调用 Model 来处理用户请求,并调用 JSP 来呈现处理结果;)
Model 通常由 JavaBean 来充当,所以业务逻辑、数据访问逻辑都在 Model 中实现。
1、MVC模式介绍,为什么要使用模式?Model模型层-View视图层-Control控制层
因为模式是一种指导,在一个良好的指导下,有助于你完成任务,
有助于你作出一个优良的设计方案,达到事半功倍的效果。
而且会得到解决问题的最佳办法。 设计模式的目标就是
提高系统的可维护性和可复用性。
(私人承包的建筑队伍和中国建设集团的区别,参考图片)
M odel : entity实体类 表示一个表的数据模型User.java
V iew : JSP 收集数据、事件处理、展示数据
C ontrol: Servlet 控制跳转
在J2EE中,一般由jsp扮演View层、Servlet扮演Control层、java撰写Model层。
JSP 仅能作为表现层(View)技术,作用有三点:
1. 负责收集用户请求参数。2. 用户事件的处理。3、状态数据呈现给用户。
Servlet 则仅充当控制器(Controller)角色,用户类似于调度员:(所以用户的请求发送给 Servlet , Servlet 调用 Model 来处理用户请求,并调用 JSP 来呈现处理结果;)
Model 通常由 JavaBean 来充当,所以业务逻辑、数据访问逻辑都在 Model 中实现。
2、新建一个Java Web Project【StuPrj】
3、新建MVC分层模式下的包,便于对不同层面的对象进行操作(面向对象思想)
com.style.control 访问控制层Servlet
com.style.dao 数据访问层DAO Data Access Object
com.style.entity 实体层 User Student等实体对象
com.style.dbutil 工具包 封装数据连接类等
4、在com.style.dbutil里写数据库的连接工具类【DBConnection.java】
5、在com.style.entity里写从数据库表抽象出来的用户User对象【User.java】
属性有int uid;String uname;String upwd;跟数据库表的字段一一对应。
6、在com.style.dao里写数据库表User的访问DAO【UserDao.java】
//根据用户名和密码来获取用户对象
public User getUser(String name,String pwd)
7、在com.style.control里写用户登录的Servlet【LoginServlet.java】
用户填入用户名密码后跳这个Servlet,
在doPost方法中调用UserDao判断用户是否有权限登录,
能登录跳转到stuinfo.jsp,不能登录踢回login.jsp
注意:JSP中和Java中导包的区别!
JSP: <%@page import="com.style.dao.StuDao"%>
Java: import com.style.dao.StuDao;
3、新建MVC分层模式下的包,便于对不同层面的对象进行操作(面向对象思想)
com.style.control 访问控制层Servlet
com.style.dao 数据访问层DAO Data Access Object
com.style.entity 实体层 User Student等实体对象
com.style.dbutil 工具包 封装数据连接类等
4、在com.style.dbutil里写数据库的连接工具类【DBConnection.java】
5、在com.style.entity里写从数据库表抽象出来的用户User对象【User.java】
属性有int uid;String uname;String upwd;跟数据库表的字段一一对应。
6、在com.style.dao里写数据库表User的访问DAO【UserDao.java】
//根据用户名和密码来获取用户对象
public User getUser(String name,String pwd)
7、在com.style.control里写用户登录的Servlet【LoginServlet.java】
用户填入用户名密码后跳这个Servlet,
在doPost方法中调用UserDao判断用户是否有权限登录,
能登录跳转到stuinfo.jsp,不能登录踢回login.jsp
注意:JSP中和Java中导包的区别!
JSP: <%@page import="com.style.dao.StuDao"%>
Java: import com.style.dao.StuDao;
三、学生管理系统实现
首先参考系统的流程图。
1、获取全部学生展示到页面上
a、首先新建学生表录入学生的信息,
并在com.style.entity包中新建Student.java类。【实体层】
b、在com.style.dao包中新建StuDao.java的类,
用于学生表的数据访问(增删改查)。【数据访问层】
新增获取所有学生的方法:public ArrayList<Student> getAllStudents()
PreparedStatement是预编译的,对于批量处理可以大大提高效率
也叫JDBC存储过程。
c、在com.style.control包中新增一个StuInfoServlet,
在doPost方法中调用StuDao的获取所有学生的方法,用户获得所有学生信息。
删除学生信息成功后跳转回stuinfo.jsp页面。
1、解决请求乱码问题、解决响应乱码问题。
2、调用DAO查询到集合数据。
3、将查到的数据存到request对象中。
4、页面转发到stuinfo.jsp。
d、准备stuInfo.jsp页面(分析原来的页面,纯jsp怎么写)
原来纯JSP页面:在尖括号百分号写java代码,页面上写【数据库连接查询、学生的每一条信息】html和java混合,循环tr输出内容
MVC实现JSP页面:
1、从请求request中得到所有学生的集合【得到数据】
2、循环tr输出内容。【展示数据】
首先参考系统的流程图。
1、获取全部学生展示到页面上
a、首先新建学生表录入学生的信息,
并在com.style.entity包中新建Student.java类。【实体层】
b、在com.style.dao包中新建StuDao.java的类,
用于学生表的数据访问(增删改查)。【数据访问层】
新增获取所有学生的方法:public ArrayList<Student> getAllStudents()
PreparedStatement是预编译的,对于批量处理可以大大提高效率
也叫JDBC存储过程。
c、在com.style.control包中新增一个StuInfoServlet,
在doPost方法中调用StuDao的获取所有学生的方法,用户获得所有学生信息。
删除学生信息成功后跳转回stuinfo.jsp页面。
1、解决请求乱码问题、解决响应乱码问题。
2、调用DAO查询到集合数据。
3、将查到的数据存到request对象中。
4、页面转发到stuinfo.jsp。
d、准备stuInfo.jsp页面(分析原来的页面,纯jsp怎么写)
原来纯JSP页面:在尖括号百分号写java代码,页面上写【数据库连接查询、学生的每一条信息】html和java混合,循环tr输出内容
MVC实现JSP页面:
1、从请求request中得到所有学生的集合【得到数据】
2、循环tr输出内容。【展示数据】
2、删除学生信息
a、在com.style.dao包StuDao.java类中,
新增删除指定学生的方法:public void deleteStudent(String sno)
b、在com.style.control包中新增一个delete的Servlet,
在doPost方法中调用StuDao的删除学生方法,用于删除学生信息。
删除学生信息完成后跳转到stuinfo的Servlet
c、JSP界面stuinfo.jsp上调用删除事件
<a href="delete?num=<%=s.getSno()%>" οnclick="return confirm('是否删除该学生信息?')">删除</a>
-----------------------------------------------------------------------
注意:【常见错误】
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
没有导包、数据库驱动字符串没有写对。
java.sql.SQLException: No value specified for parameter 1
你sql语句中的参数和你设置的?不对应
-----------------------------------------------------------------------
3、添加学生信息
a、在com.style.dao包StuDao.java类中,
新增添加学生的方法:public void addStudent(Student s)
b、在stuinfo.jsp上新增添加的学生的链接:
<a href="addstu.jsp">添加学生</a>
c、新建addstu.jsp页面、参考前期的新增学生页面(纯表单界面)。
d、在新学生信息填写完毕后,提交到一个处理数据的Servlet:
在com.style.control包中新增一个add的Servlet
1、解决请求乱码问题、解决响应乱码问题
2、获取前一个页面传递过来的参数
3、把数据封装成Student
4、调用DAO,将数据插入数据库
5、新增完成后跳转到stuinfo的Servlet
a、在com.style.dao包StuDao.java类中,
新增删除指定学生的方法:public void deleteStudent(String sno)
b、在com.style.control包中新增一个delete的Servlet,
在doPost方法中调用StuDao的删除学生方法,用于删除学生信息。
删除学生信息完成后跳转到stuinfo的Servlet
c、JSP界面stuinfo.jsp上调用删除事件
<a href="delete?num=<%=s.getSno()%>" οnclick="return confirm('是否删除该学生信息?')">删除</a>
-----------------------------------------------------------------------
注意:【常见错误】
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
没有导包、数据库驱动字符串没有写对。
java.sql.SQLException: No value specified for parameter 1
你sql语句中的参数和你设置的?不对应
-----------------------------------------------------------------------
3、添加学生信息
a、在com.style.dao包StuDao.java类中,
新增添加学生的方法:public void addStudent(Student s)
b、在stuinfo.jsp上新增添加的学生的链接:
<a href="addstu.jsp">添加学生</a>
c、新建addstu.jsp页面、参考前期的新增学生页面(纯表单界面)。
d、在新学生信息填写完毕后,提交到一个处理数据的Servlet:
在com.style.control包中新增一个add的Servlet
1、解决请求乱码问题、解决响应乱码问题
2、获取前一个页面传递过来的参数
3、把数据封装成Student
4、调用DAO,将数据插入数据库
5、新增完成后跳转到stuinfo的Servlet
4、修改学生信息
a、在com.style.dao包StuDao.java类中,
新增修改学生的方法:public void updateStudent(Student s)
b、JSP界面stuinfo.jsp上调用修改事件
<a href="update?num=<%=s.getSno()%>">修改</a>
c、新建updatestu.jsp页面参考前期的修改学生页面(纯表单界面,对比之前界面)
d、在新学生信息修改完毕后(学生编号不能改),提交到update的Servlet。
e、在com.style.control包中新增一个update的Servlet
1、解决请求乱码问题、解决响应乱码问题
2、调用DAO,进行数据库修改操作
5、修改完成后跳转到stuinfo的Servlet
a、在com.style.dao包StuDao.java类中,
新增修改学生的方法:public void updateStudent(Student s)
b、JSP界面stuinfo.jsp上调用修改事件
<a href="update?num=<%=s.getSno()%>">修改</a>
c、新建updatestu.jsp页面参考前期的修改学生页面(纯表单界面,对比之前界面)
d、在新学生信息修改完毕后(学生编号不能改),提交到update的Servlet。
e、在com.style.control包中新增一个update的Servlet
1、解决请求乱码问题、解决响应乱码问题
2、调用DAO,进行数据库修改操作
5、修改完成后跳转到stuinfo的Servlet
5、知识扩展和常见问题:
a、转发和重定向的区别
见示例项目:WebDemo
转发:
request.getRequestDispatcher("/index").forward(request, response);
重定向:
response.sendRedirect("index"); 不能有斜杠
区别:
地址栏:转发地址栏的URL不会变化,重定向地址栏的URL会变成定向后的地址。
参数: 转发会将request和response里的参数带过去,重定向不能携带参数。
发生在:转发发生在服务器,重定向发生的客户端。
原理: 转发----->请求--->demo1--->带着你和你的礼物私下去找--->index.jsp
重定向--->请求--->demo2--->收下你的礼物给你一个消息(去找index.jsp)
--->请求--->index.jsp (礼物没有了)
图示:见图示。
问题:帐号密码错误了,要跳转回login.jsp,重定向还是转发?点击修改按钮,进入UpdateInitServlet,根据拿到的学号,查询到一个Student信息,跳转到update.jsp,重定向还是转发?
a、转发和重定向的区别
见示例项目:WebDemo
转发:
request.getRequestDispatcher("/index").forward(request, response);
重定向:
response.sendRedirect("index"); 不能有斜杠
区别:
地址栏:转发地址栏的URL不会变化,重定向地址栏的URL会变成定向后的地址。
参数: 转发会将request和response里的参数带过去,重定向不能携带参数。
发生在:转发发生在服务器,重定向发生的客户端。
原理: 转发----->请求--->demo1--->带着你和你的礼物私下去找--->index.jsp
重定向--->请求--->demo2--->收下你的礼物给你一个消息(去找index.jsp)
--->请求--->index.jsp (礼物没有了)
图示:见图示。
问题:帐号密码错误了,要跳转回login.jsp,重定向还是转发?点击修改按钮,进入UpdateInitServlet,根据拿到的学号,查询到一个Student信息,跳转到update.jsp,重定向还是转发?
b、关于跳转路径中带不带/的问题。
1、对于JSP页面来说,斜杠代表web服务器(tomcat)的根目录
2、对于Servlet来说,斜杠代表项目的根目录。
response.sendRedirect("login.jsp"); //响应是JSP页面级别的
c、Servlet中怎么获取客户端浏览器传过来的参数?
String name = request.getParameter("name"); 姓名
String[] strs= request.getParameterValues("ah"); 爱好
c、每一步DAO中访问数据库的方法开发完成后在main方法中测试一次。
d、DBConnection.java数据库连接工具类。
e、数据库中字段使用数据库关键字如:like、in等,sql中使用``包起来可以解决。
f、关于DAO层继续抽象出BaseDao的扩展
1、对于JSP页面来说,斜杠代表web服务器(tomcat)的根目录
2、对于Servlet来说,斜杠代表项目的根目录。
response.sendRedirect("login.jsp"); //响应是JSP页面级别的
c、Servlet中怎么获取客户端浏览器传过来的参数?
String name = request.getParameter("name"); 姓名
String[] strs= request.getParameterValues("ah"); 爱好
c、每一步DAO中访问数据库的方法开发完成后在main方法中测试一次。
d、DBConnection.java数据库连接工具类。
e、数据库中字段使用数据库关键字如:like、in等,sql中使用``包起来可以解决。
f、关于DAO层继续抽象出BaseDao的扩展