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文件的配置:

由三部分组成,或者说是必须的两部分组成。

第一部分:由组成。它相当于一个容器,用来存放关于类的定义。

定义类的名称

定义类的路径。就是一个包.类名。在java学习里面,我们也是这么用的。但是这仅仅是声明,要使用它,还必须配置映射。


    This is the description of my J2EE component
    This is the display name of my J2EE component
    WelcomeServlet
    servlets.WelcomeServlet
 

第二部分:由组成。它是servlet类的映射。

设定类的名称 。(这个作用和前面那个是一样的,需要保持一致)

配置servlet类的映射。(就是说明哪些类会被servlet类所使用。这个映射的路径不一定是类的路径噢!!)为了方便,一般都是类的路径,在过滤器那里,就会区分这种。

 
    WelcomeServlet
    /servlet/WelcomeServlet
 

第三部分:Web容器默认设置的页面。
 
    index.jsp
 

小结一下:第一部分和第二部分是绑定的,第一部分相当于一个类和它的路径的声明,第二部分才是开始使用。(所以第二部分才是真正重要的!!!)这就是为什么在JSP里面很少看见一个的类的声明。大部分都是直接使用了。

2.Servlet的生命周期:

Servlet和JavaBean开发(VO)(javaWeb第二部分)_第1张图片

从图 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文件里面,使得规定的文件使用什么参数。

分为全局参数和局部参数。全局参数所有文件都能使用,局部参数只有规定的文件能使用。

全局参数:           

//常用于定义全局的编码方式(encoding = "gb2312")

局部参数:                     

//在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定义这个类的名字是什么!!还有表单的提交方式 %>
   

问题二: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 books = new ArrayList();

第四个问题:怎么将数据库查询的语句导出来。千万注意不是toString,这个方法是类型转换方法:

如:这就是toString的用法,正确得到rs的语句方法是:rs.getString();

double value = 1.23;
String stringValue = Double.toString(value);

while (rs.next()) {
                //误区:怎么获得rs里面的数据,使用toString方法.不是这个方法,又错了
                ArrayList book = new ArrayList();
                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 + "
");
            }

第九章 JSP和JavaBean(主要还是讲述DAO和VO)

JavaBean是一种特殊的Java类,它遵循特定的命名约定,具有可序列化性,并且可以通过公共getter和setter方法访问其属性。在JSP中,JavaBean通常用于封装数据,以便在JSP页面和servlet之间传递数据。

在JSP页面中,您可以使用标签来创建和初始化JavaBean实例。例如:

 

在上面的示例中,我们使用标签创建了一个名为myBean的JavaBean实例,并使用标签设置了它的name属性值为John。您还可以使用标签来获取JavaBean实例的属性值。

除了使用标签外,您还可以在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         //误区:student不应该是String类型,因为如果是这个类型,后面就用不了student的方法
          Student student = (Student)students.get(i);     //这个巨重要!!!
       //这里直接输出student是可以的,但是用后面的方法可以指定输出内容。
          //out.println(student+"
");
          out.println("学号:"+student.get学号()+"  姓名:"+student.get姓名()+"
");
        }

//缺少了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+"
");//测试数据
    //Student student = (Student)students.get(i); //并不是因为转换成student类少了嵌套,是get(i)得到的。然后告诉说这是一个student类型
    //out.println(student+"
");
    //out.println("学号:"+student.get学号()+"  姓名:"+student.get姓名()+"
");

你可能感兴趣的:(servlet,java,前端)