第八章: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第二部分)相关推荐

  1. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  2. javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. javaweb学习总结——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  4. 【转载】 javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册 - 孤傲苍狼 - 博 http://www.cnblogs.com/xdp-gacl/

    javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+Ja ...

  5. 基于Servlet+JSP+JavaBean开发模式的用户登录注册

    基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复 ...

  6. javaweb开发3.基于Servlet+JSP+JavaBean开发模式的用户登录注册

    转载孤傲苍狼博客http://www.cnblogs.com/xdp-gacl/p/3902537.html 1.层次比较分明的项目结构图 转载于:https://www.cnblogs.com/lv ...

  7. MVC框架详解--Servlet+JSP+JavaBean模式(MVC)开发复杂的web应用

    孤傲苍狼 javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 转载于:https://www.cnblogs.com/yangjj08/p/1015 ...

  8. java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  9. JavaWeb实战教程(Servlet+JSP+JavaBean)-雷伟-专题视频课程

    JavaWeb实战教程(Servlet+JSP+JavaBean)-1401人已学习 课程介绍         本课程主要介绍Jsp,Servlet基础知识,讲解Jsp+Servlet+JavaBea ...

最新文章

  1. YOLO-v5训练自己的数据+TensorRT推理部署(2)
  2. 【 Vivado 】XDC文件的约束顺序
  3. 蓝桥杯:基础练习 回文数
  4. linux常用指令_Linux系统常用指令总结
  5. Android中Context详解
  6. cmd命令不识别exp_Cmder-超量级的Cmd
  7. Linux 命令(30)—— scp 命令
  8. Controller层返回字符串
  9. C# word 转 pdf
  10. Android之Surface/Window/View/SurfaceView区别
  11. Android KeyCode 列表
  12. 15. POSIX 线程
  13. mysql 优化代码_Mysql语句-优化代码
  14. 51单片机程序0到60计数个位逢5和6不显示,十位逢1不显示http://www.51hei.com/bbs/mcu-h24-1.html
  15. CentOS 编译运行 DPDK 19.11 流程
  16. bootstrap-tagsinput操作标签对象,实现从表格中选人和移除
  17. 有效 360 度反馈系统的关键
  18. 酷我音乐盒破解教程(一)
  19. iOS App Singer 重签名工具的使用简介
  20. TDDFT计算软件Octopus学习笔记(三):能带结构(ZnO)

热门文章

  1. 信息系统服务器品牌,星神信息发布系统十大品牌,打造办公楼智能化平台!
  2. java编程JDK安装
  3. word中,如何在上一页增加文字时,下一页的文字保持不动
  4. 简明 Python3 教程 | 学习笔记
  5. html table nowrap,HtmlTableCell.NoWrap 属性 (System.Web.UI.HtmlControls) | Microsoft Docs
  6. python分析集聚程度_统计分析_集中趋势and离散程度
  7. JPA常用注解详细讲解
  8. jQuery效果之滑动退出滑动显示 slideUp、slideDown
  9. 第十话-模板方法模式
  10. 化学中计算机模拟试题,计算机在化学中的应考试试卷-2015.doc