Servlet和JavaBean开发(VO)(javaWeb第二部分)
第八章:Servlet编程
Servlet编程是Java Web应用程序开发的一部分。JSP(Java Server Pages)是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
在仅使用Servlet的web应用开发中,部分Servlet代码通过使用打印语句打印HTML标签来在浏览器中显示页面,而JSP可以代替显示页面的Servlet。
Servlet是运行在Web服务器端的Java应用程序,属于客户与服务器响应的中间层。(相当于一个.java类,属于纯编程)
1.先来学习web.xml文件的配置:
由三部分组成,或者说是必须的两部分组成。
第一部分:由<servlet>组成。它相当于一个容器,用来存放关于类的定义。
<servlet-name>定义类的名称
<servlet-class>定义类的路径。就是一个包.类名。在java学习里面,我们也是这么用的。但是这仅仅是声明,要使用它,还必须配置映射。
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>servlets.WelcomeServlet</servlet-class>
</servlet>
第二部分:由<servlet-mapping>组成。它是servlet类的映射。
<servlet-name>设定类的名称 。(这个作用和前面那个是一样的,需要保持一致)
<url-pattern>配置servlet类的映射。(就是说明哪些类会被servlet类所使用。这个映射的路径不一定是类的路径噢!!)为了方便,一般都是类的路径,在过滤器那里,就会区分这种。
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/servlet/WelcomeServlet</url-pattern>
</servlet-mapping>
第三部分:Web容器默认设置的页面。
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
小结一下:第一部分和第二部分是绑定的,第一部分相当于一个类和它的路径的声明,第二部分才是开始使用。(所以第二部分才是真正重要的!!!)这就是为什么在JSP里面很少看见一个的类的声明。大部分都是直接使用了。
2.Servlet的生命周期:
从图 9-9 中可以看出,大概流程:所以这就是为什么我们每一次运行这个java应用程序,他从doGet开始运行。
当客户端向 Web 服务器提出第 1 次Servlet请求时,Web 服务器会实例化一个Servlet,并且调用init()方法;(只有第一次请求会实例化,之后再此调用使用的都是之前实例化的)
如果Web服务器中已经存在了一个Servlet实例,将直接使用此实例;
然后调用service()方法,service()方法将根据客户端的请求方式来决定调用对应的doXXX()方法;(如果没有service方法,默认是使用doGet方法)
当Servlet从Web 服务器中消亡时,Web 服务器将会调用 Servlet 的 destroy()方法。
(大概流程就是,你通过浏览器访问服务器的java应用程序,它首先实例化,然后调用service方法选择使用哪个doXXX方法,最后Servlet消亡,使用destroy()方法)
3.Servlet对应的JSP内置对象的接口:(需要记忆!)
out对象: PrintWriter out = response.getWriter();
//PrintWriter类 获得out对象 ,它的值为 response.getWriter()
request和response对象: public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ }
//它们作为参数的时候就已经有了。
session对象:HttpSession session = request.getSession();
//和获取out对象的方法差不多。不过它的值为request 。(购物车关系)
application对象:ServletContext application = this.get ServletContext();
//和获取out对象的方法差不多。不过它的值为this.(共享关系)
Servlet内部跳转:
重定向方法:response.sendRedirect(“内部地址”);
//用法和jsp里面使用jsp表达式的方法是一样的。
服务器内部跳转:用到application对象,这里省略。
3.5 在Servlet中使用参数:
其实就是把参数放在web.xml文件里面,使得规定的文件使用什么参数。
分为全局参数和局部参数。全局参数所有文件都能使用,局部参数只有规定的文件能使用。
全局参数:<context-param> </context-param>
//常用于定义全局的编码方式(encoding = "gb2312")
局部参数:<servlet> <init-param> </init-param> </servlet>
//在servelt声明的类中使用这个参数。(常用于连接数据库中的,注册驱动程序。class.forName)
获取参数:getInitParameter(“参数名称”);
4.过滤器:
和前面介绍的第一步布置web.xml文件类似。使用它的方式和前面配置全局参数的使用方式有点相似。都是规定给谁使用。
不过,过滤器要复杂一些。
过滤器还需要创建一个过滤器的类。然后配置web.xml文件的过滤器类。规定哪个文件类使用过滤器。
下面代码分析。
5.编写Servlet的顺序:
(1)让创建的类继承HttpServlet
(2)重写HttpServlet的doGet()方法 //这个看情况,默认是调用这个方法
(3)配置Servlet。 //就是配置web.xml文件,前面讲了三部分。
(4)部署Servlet。 //和前面学的部署一样
(5)测试 //输入网址
6.代码分析:
通过查询学生姓名,提交给另一个类,这个类要显示查询的学生姓名。(使用Servlet参数的方式和过滤器的方式分别分析)
问题一:form.jsp
<%//误区:action虽然是交给DealServlet.java文件,但是注意web.xml定义这个类的名字是什么!!还有表单的提交方式 %>
<form action="servlets/DealServlet" method="post">
问题二:DealServlet.jsp
在解决编码的方式里面,有两种方式:
//(第一种方式)!!!是可以的,可能我前面记错了,request.getParamter(这个是错误的,应该是我前面记错了。)
// request.setCharacterEncoding("gb2312"); //记忆这个,不要记错了
//尝试前面学过的第二种方式!!!!牢记这种方式。
//stuname=new String(stuname.getBytes("ISO-8859-1"));
问题三:区分out对象和sysout的使用方式。
//注意:out对象可以使在web界面输出信息,而sysout只能在控制台输出信息。这是区别。需要记忆out的搭配
response.setContentType("text/html;charset=gb2312"); 和request有点不同。
PrintWriter out = response.getWriter();
问题四:使用过滤器的优点
可以不用前面两种方式,因为前面两种方式,如果有很多个类,那么每一个类都需要重写一次那个中文编码方式。
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
//第三种方式。可以使得使用中文编码
arg0.setCharacterEncoding("gb2312");
//暂时记一下。
arg2.doFilter(arg0, arg1);
}
案例实训:
由于一直出现连接数据库出错的原因,在这个上面耽误太长时间。pass。往下学。看看怎么划分dao类和bena类的。(Pass,第二天再来学习,不到半个小时,问题都解决了)
好的,下面进行分析:
第一个问题:乱码的问题。Query.jsp
出现的状况如下:建议使用一个out.print打印看得到的结果是否乱码。
//问题出在乱码上。???第二天使用这个又好了?
request.setCharacterEncoding("gb2312");
String bookname = request.getParameter("bookname");
//为什么这次用这个乱码了?
// bookname=new String(bookname.getBytes("ISO-8859-1"));
// out.print(bookname);
第二个问题:sql查询语句
//如果bookname为null,那么下面这句话相当于查询所有!!记下
String sql = "SELECT * from T_BOOK WHERE bookname LIKE '%" + bookname + "%' ";
第三个问题:传回数据,都用session暂存。这个一定要记好。
//误区:怎么将获得的book传回给book.jsp呢,前面学过了session购物车。可以使用这个方法暂存。
//存在一个很大的问题,就是在jsp里面,session都是直接就可以使用。但是在java应用程序里面,必须先声明才能使用。如下
HttpSession session = request.getSession(); //声明!!java特有
ArrayList<String> books = new ArrayList<String>();
第四个问题:怎么将数据库查询的语句导出来。千万注意不是toString,这个方法是类型转换方法:
如:这就是toString的用法,正确得到rs的语句方法是:rs.getString();
double value = 1.23;
String stringValue = Double.toString(value);
while (rs.next()) {
//误区:怎么获得rs里面的数据,使用toString方法.不是这个方法,又错了
ArrayList<String> book = new ArrayList<String>();
book.add(rs.getString("bookno")+"|");
book.add(rs.getString("bookname")+"|");
book.add(rs.getString("bookprice"));
//这里注意一下,book属于ArrayList集合,添加book到另一个集合的方法是addAll
books.addAll(book);
}
第五个问题:session的位置,都是放在遍历的外面,不要放在rs循环里面
//误区:session放外面
session.setAttribute("bookquery", books);
//记忆:使用重定向可以返回
response.sendRedirect("/prj09/book.jsp");
第六个问题:对于ArrayList集合,这个方法要记,一个是size(),一个是get方法。而且get方法需要类型转换。
for (int i = 0; i < booksQuery.size(); i++) {
String book = (String) booksQuery.get(i);
out.println(book + "<br>");
}
第九章 JSP和JavaBean(主要还是讲述DAO和VO)
JavaBean是一种特殊的Java类,它遵循特定的命名约定,具有可序列化性,并且可以通过公共getter和setter方法访问其属性。在JSP中,JavaBean通常用于封装数据,以便在JSP页面和servlet之间传递数据。
在JSP页面中,您可以使用<jsp:useBean>标签来创建和初始化JavaBean实例。例如:
<jsp:useBean id="myBean" class="com.example.MyBean" scope="request">
<jsp:setProperty name="myBean" property="name" value="John"/>
</jsp:useBean>
在上面的示例中,我们使用<jsp:useBean>标签创建了一个名为myBean的JavaBean实例,并使用<jsp:setProperty>标签设置了它的name属性值为John。您还可以使用<jsp:getProperty>标签来获取JavaBean实例的属性值。
除了使用<jsp:useBean>标签外,您还可以在servlet中创建和初始化JavaBean实例,并将其存储在请求、会话或应用程序范围内,以便在JSP页面中访问。
其实就是把之前写在JSP页面的Java代码,都放入JavaBean里面。然后在JSP里面需要用到的Java类就是JavaBean
1.由于现在单使用JavaBean的次数比较少,就跳过这里,主要讲述DAO和VO的使用。
2.DAO和VO
DAO(Data Access Object,数据访问对象)是一种设计模式,用于将应用程序中的数据访问逻辑与业务逻辑分离。DAO类通常负责与数据库交互,执行CRUD(创建、读取、更新、删除)操作。它为应用程序提供了一个抽象层,使应用程序能够与不同类型的数据源(如关系数据库、XML文件等)进行交互,而无需更改业务逻辑代码。
VO(Value Object,值对象)是一种设计模式,用于封装应用程序中的数据。VO类通常包含一组属性和相应的getter和setter方法,用于存储和访问数据。它通常用于在应用程序的不同层之间传递数据,例如在表示层和业务逻辑层之间传递数据。
总之,DAO类负责与数据源交互,执行数据访问操作;而VO类则负责封装数据,在应用程序的不同层之间传递数据。(一般来说,VO类其实也被用作Beans类。)
结合前面所学,使用封装的方法来实现一个查询学生库的程序:(建议回到之前的java学习,比较这个一下这个方法)
代码分析:
这里需要引以为戒!!!以后每写完一个代码,就测试一下,这样就不会出错。不然,到最后再来测试的话,就出现一大堆的问题,而且还找不出来。
第一个测试:Dao类封装数据库的连接。
// //先进行测试,增加一个主类来进行测试,测试命令是:shift+alt+j
// public static void main(String[] args) throws Exception{
// StudentDao student = new StudentDao(); // StudentDao就是这个类
// student.queryStudent();
System.out.println("dadasss");
// }
凡是出现com.mysql.jdbc.Driver这种异常,就是忘了连接数据库。
//cao了呀,md,数据库没手动注册!!!!
Class.forName("com.mysql.jdbc.Driver");
第二个测试:数据是否获取到。Dao类。
ArrayList students = new ArrayList();
Student student =new Student();
students.add(student);
//如果要直接输出students里的内容,调用此方法还需要重写toString方法。
// System.out.println(students);
但是注意,此时,students里面是数据库的数据地址,不是数据内容。需要在Student类里面为它重写一个toString方法。
第三个测试:在Servlet类里面测试数据。
看是否获取到jsp提交的数据:
String name=request.getParameter("姓名"); //暂时先没用
// out.print(name); //测试
调用StudentDao类,先声明在使用方法。注意这个方法必须使用try来使用!!!
StudentDao studentdao = new StudentDao();
ArrayList students = null;
try {
students= studentdao.queryStudent(name);
out.println(students); //测试是否获取到了dao类的数据。
} catch (Exception e) { }
第四个测试:在jsp里面测试是否获取到数据。
JSP里面<%%>
ArrayList students=(ArrayList)session.getAttribute("students");
//out.println(students);//测试是否获取到了数据
代码分析:此时才用到了遍历。前面都没必要用到遍历。测试数据,直接输出集合就可以了
for(int i=0;i<students.size();i++){
//误区:student不应该是String类型,因为如果是这个类型,后面就用不了student的方法
Student student = (Student)students.get(i); //这个巨重要!!!
//这里直接输出student是可以的,但是用后面的方法可以指定输出内容。
//out.println(student+"<br>");
out.println("学号:"+student.get学号()+" 姓名:"+student.get姓名()+"<br>");
}
//缺少了where后面要加一个数据库里面的内容。所以导致错误了
String sql = "select * from dada where 姓名 like '%"+ name +" %' ";
第二个错误:数据库sql语句发生错误,因为这里有通配符,通配符后面加了空格,导致它会匹配name后面的空格。
小结:
顺序是:
0.先创建一个benas类(VO类)用来封装数据库的数据。只声明,注意这个也要创建一个toString方法,用来后面测试数据用。
1.然后创建一个Dao类,用来连接数据库,注意,需要测试数据是否连接获取到数据库里的内容。需要调用benas类里面的Student类。将获取到的数据内容一一导入。然后再进行测试,是否导入成功。(千万注意,Dao类的测试,需要创建主类。Dao类是一个java应用,它不在服务器里面展示,需要将其交给Servlet类,才能展示在服务器端,测试完后需要注释掉主类)
2.然后在servlet类里面,调用Dao类的对象,使用Dao类的方法获取最后得到的数据。需要是否已获取到了。然后将数据交给session方法。用这个叫做“购物车”的方法暂存数据。
3.最后在jsp里面,把上一个放在“购物车”session方法里面的数据取出来。需要测试是否取出来了数据。还没结束。如果需要获取指定数据。那么需要将这个数据转为student类型。然后使用student类型的方法,就能获取到指定数据。(千万注意,不能把原先的数据直接转换成student类型,原先的数据是一个students类型,是一个两层嵌套,需要我们用get(i)的方法遍历获得正常集合的数据。这样才能转为student类型。)
//1.在StudentDao里面。这里少了连接数据库是否获取到数据内容后的测试。
//Student [学号=001, 姓名=李文达, 性别=男, 出生地=湖南, 成绩=0]
//[Student [学号=001, 姓名=李文达, 性别=男, 出生地=湖南, 成绩=0]]
//ArrayList students = new ArrayList();
//Student student =new Student(); 调用Student类
//student.set学号(rs.getString("学号")); //使用student对象的方法,设置它的属性值
//students.add(student); //最后将属性值赋给students集合。
//System.out.println(student); //student本身输出是一个属性集合。不是一个单集合!!!
//System.out.println(students);
//2。在Query.java里面
//[Student [学号=003, 姓名=邓友涛, 性别=女, 出生地=缅甸, 成绩=0]]
//这里我稍微感觉有点奇怪,因为dao类返回的数据本身是一个集合了,这里再赋给一个集合,不应该是在原先的集合上在嵌套一个集合吗???疑问
//ArrayList students= studentdao.queryStudent(name); //将studentDao获得的数据赋给另外一个students集合
//out.println(students); //测试是否获取到数据 //如果是集合对象,那么最后输出的就是集合
//session.setAttribute("students", students);
//3.在queryStudent.jsp里面
//[Student [学号=001, 姓名=李文达, 性别=男, 出生地=湖南, 成绩=0]]
//Student [学号=001, 姓名=李文达, 性别=男, 出生地=湖南, 成绩=0]
//学号:001 姓名:李文达
//这里又是这样,可能,就是前面只是一个声明,并没有说再赋给一个嵌套。
// ArrayList students=(ArrayList)session.getAttribute("students");
//out.println(students+"<br>");//测试数据
//Student student = (Student)students.get(i); //并不是因为转换成student类少了嵌套,是get(i)得到的。然后告诉说这是一个student类型
//out.println(student+"<br>");
//out.println("学号:"+student.get学号()+" 姓名:"+student.get姓名()+"<br>");
Servlet和JavaBean开发(VO)(javaWeb第二部分)相关推荐
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- 【转载】 javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册 - 孤傲苍狼 - 博 http://www.cnblogs.com/xdp-gacl/
javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+Ja ...
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复 ...
- javaweb开发3.基于Servlet+JSP+JavaBean开发模式的用户登录注册
转载孤傲苍狼博客http://www.cnblogs.com/xdp-gacl/p/3902537.html 1.层次比较分明的项目结构图 转载于:https://www.cnblogs.com/lv ...
- MVC框架详解--Servlet+JSP+JavaBean模式(MVC)开发复杂的web应用
孤傲苍狼 javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 转载于:https://www.cnblogs.com/yangjj08/p/1015 ...
- java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...
下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...
- JavaWeb实战教程(Servlet+JSP+JavaBean)-雷伟-专题视频课程
JavaWeb实战教程(Servlet+JSP+JavaBean)-1401人已学习 课程介绍 本课程主要介绍Jsp,Servlet基础知识,讲解Jsp+Servlet+JavaBea ...
最新文章
- YOLO-v5训练自己的数据+TensorRT推理部署(2)
- 【 Vivado 】XDC文件的约束顺序
- 蓝桥杯:基础练习 回文数
- linux常用指令_Linux系统常用指令总结
- Android中Context详解
- cmd命令不识别exp_Cmder-超量级的Cmd
- Linux 命令(30)—— scp 命令
- Controller层返回字符串
- C# word 转 pdf
- Android之Surface/Window/View/SurfaceView区别
- Android KeyCode 列表
- 15. POSIX 线程
- mysql 优化代码_Mysql语句-优化代码
- 51单片机程序0到60计数个位逢5和6不显示,十位逢1不显示http://www.51hei.com/bbs/mcu-h24-1.html
- CentOS 编译运行 DPDK 19.11 流程
- bootstrap-tagsinput操作标签对象,实现从表格中选人和移除
- 有效 360 度反馈系统的关键
- 酷我音乐盒破解教程(一)
- iOS App Singer 重签名工具的使用简介
- TDDFT计算软件Octopus学习笔记(三):能带结构(ZnO)
热门文章
- 信息系统服务器品牌,星神信息发布系统十大品牌,打造办公楼智能化平台!
- java编程JDK安装
- word中,如何在上一页增加文字时,下一页的文字保持不动
- 简明 Python3 教程 | 学习笔记
- html table nowrap,HtmlTableCell.NoWrap 属性 (System.Web.UI.HtmlControls) | Microsoft Docs
- python分析集聚程度_统计分析_集中趋势and离散程度
- JPA常用注解详细讲解
- jQuery效果之滑动退出滑动显示 slideUp、slideDown
- 第十话-模板方法模式
- 化学中计算机模拟试题,计算机在化学中的应考试试卷-2015.doc