Servlet

本文介绍了Servlet的基本概念及其在Web应用中的作用,包括请求-响应模型、生命周期管理等内容。同时,深入探讨了JSP的两种开发模型:JSPModel1和JSPModel2,并通过案例演示了如何实现增删改查功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. Servlet

    1. Servlet

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。

Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包

一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序

工作模式

客户端发送请求至服务器

服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器

服务器将响应返回客户端

 

  1. 怎么使用Servlet
  • 创建包存放servlet(com.demo. Servlet)

  • 编写Servlet

右击包ànewàServlet

 

点击Finish

  1. Servlet生命周期
  2. 客户端请求该 Servlet;
  3. 加载 Servlet 类到内存;
  4. 实例化并调用init()方法初始化该 Servlet;
  5. service()(根据请求方法不同调用doGet() 或者 doPost())。

  init()方法 在第一次访问该Servlet的时候调用(只会调用一次)

  doget()/doPost() 每访问一次,根据请求的方式 调用一次(每访问一次调用一次)

destroy() 正常关闭服务器调用(右击server点击stop)

 

    1. JSP开发模型
  1. JSP Model
  • JSP Model
  • JSP Model即JSP的开发模型。Sun公司为JSP技术提供了两种开发模型:JSP Model1JSP Model2
  • JSP Model1简单轻便适合小型Web项目的快速开发

JSP Model2模型是在JSP Model1的基础上提出的,它提供了更清晰的代码分层,更适用于多人合作开发的大型Web项目

 

  • JSP Model1

在早期使用JSP开发的JavaWeb应用中,JSP文件是一个独立的、能自主完成所有任务的模块,它负责处理业务逻辑、控制网页流程和向用户展示页面等,接下来通过一张图来描述JSP早期模型的工作原理,如图9-1所示

从图9-1中可以看出,浏览器请求JSP,JSP直接对数据库进行各种操作,将结果响应给浏览器。但是在程序中,JSP页面功能的“过于复杂”给开发带来了一系列的问题,比如JSP页面中HTML代码和Java代码强耦合在一起,代码的可读性很差,数据、业务逻辑,控制流程混合在一起,使得程序难以修改和维护

 

 

  • 为了解决上述问题,SUN公司提供了一种JSP开发的架构模型—JSP Model1

JSP Model1采用JSP+JavaBean技术,将页面显示和业务逻辑分开。通过一张图来描述JSP Model1的工作原理,如图9-2所示

 

从图9-2中可以看出,JSP Model 1模型将封装数据以及处理数据的业务逻辑的任务交给了JavaBean组件,JSP只负责接受用户请求和调用JavaBean组件来响应用户的请求,这种设计实现了数据、业务逻辑和页面显示的分离,在一定程度上实现了程序开发的模块化,降低了程序修改和维护的难度。

 

 

  • JSP Model2
  • JSP Model 2架构模型采用JSP+Servlet+ JavaBean的技术,此技术将原本JSP页面中的流程控制代码提取出来,封装到Servlet中,从而实现了整个程序页面显示、流程控制和业务逻辑的分离。

实际上JSP Model2模型就是MVC(模型Model-视图View-控制器Controller)设计模式,其中控制器的角色是由Servlet实现,视图的角色是由JSP页面实现,模型的角色是由JavaBean实现

 

  • 接下来通过一张图来描述Model 2的工作原理,如图9-3所示。

从图9-3中可以看出,Servlet充当了控制器的角色,它接受用户请求,并实例化JavaBean对象封装数据和对业务逻辑进行处理,然后将调用JSP页面显示JavaBean中的数据信息。

  • Mvc与三层的关系和区别

Mvc是一种设计模式

三层是一种编程思想

      两者不要混为一谈,作用都是为了解耦

      两者的关系见下图

    1. 实现贯穿案例中的新增功能

思路分析

代码编写:

  1. 导入jar

  1.  创建add.jsp页面

<body>

    <form action="" method="post">

       <table border="1px" style="text-align: center;">

           <tr>

              <td>图书编号</td>

              <td><input id="code" name="code" ><span

                  id="codeMessage"></span></td>

           </tr>

           <tr>

              <td>图书名称</td>

              <td><input name="bookname"></td>

           </tr>

           <tr>

              <td>图书分类</td>

              <td style="text-align: left;">

              <select name="booktypeid">

              <option value="1">文学</option>

                  <option value="2">儿童</option>

                  <option value="3">武侠</option>

              </select>

              </td>

           </tr>

           <tr>

              <td>作者</td>

              <td><input name="author"></td>

           </tr>

           <tr>

              <td>出版社</td>

              <td><input name="press"></td>

           </tr>

           <tr>

              <td>出版时间</td>

              <td><input name="publishdate"></td>

           </tr>

           <tr>

              <td colspan="2"><input type="hidden" name="choose" value="1">

                  <input type="submit" value="提交"> <input type="button"

                  value="取消"></td>

 

           </tr>

       </table>

    </form>

</body>

  1. 创建Servlet(一个实体类对应一个Servlet)

@WebServlet("/bookServlet.do")

public class BookServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BookServlet() {

        super();

        // TODO Auto-generated constructor stub

    }

 

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       // TODO Auto-generated method stub

       response.getWriter().append("Served at: ").append(request.getContextPath());

    }

 

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       // TODO Auto-generated method stub

       doGet(request, response);

    }

 

}

  1. 修改add.jsp from表单的action地址为BookServlet对应的url

 

 

 

 

 

  1. 获取页面的参数的值

  1. 编写pojo及三层及c3p0

public class Book {

    private Integer book_id;

    private String book_code;

    private String book_name;

    private Integer book_type;

    private String book_author;

    private String publish_press;

    private Date publish_date;

    private Integer is_borrow;

 

    public Integer getBook_id() {

       return book_id;

    }

 

    public void setBook_id(Integer book_id) {

       this.book_id = book_id;

    }

 

    public String getBook_code() {

       return book_code;

    }

 

    public void setBook_code(String book_code) {

       this.book_code = book_code;

    }

 

    public String getBook_name() {

       return book_name;

    }

 

    public void setBook_name(String book_name) {

       this.book_name = book_name;

    }

 

    public Integer getBook_type() {

       return book_type;

    }

 

    public void setBook_type(Integer book_type) {

       this.book_type = book_type;

    }

 

    public String getBook_author() {

       return book_author;

    }

 

    public void setBook_author(String book_author) {

       this.book_author = book_author;

    }

 

    public String getPublish_press() {

       return publish_press;

    }

 

    public void setPublish_press(String publish_press) {

       this.publish_press = publish_press;

    }

 

    public Date getPublish_date() {

       return publish_date;

    }

 

    public void setPublish_date(Date publish_date) {

       this.publish_date = publish_date;

    }

 

    public Integer getIs_borrow() {

       return is_borrow;

    }

 

    public void setIs_borrow(Integer is_borrow) {

       this.is_borrow = is_borrow;

    }

 

    @Override

    public String toString() {

       return "Book [book_id=" + book_id + ", book_code=" + book_code + ", book_name=" + book_name + ", book_type="

              + book_type + ", book_author=" + book_author + ", publish_press=" + publish_press + ", publish_date="

              + publish_date + ", is_borrow=" + is_borrow + "]";

    }

 

}

 

BookService

BookServiceImpl

BookDao

BookDaoImpl

public class BookDaoImpl implements BookDao {

 

    private QueryRunner queryRunner = C3P0Util.getQueryRunner();

 

    @Override

    public int addBook(Book book) {

       String sql = "insert into book_info(book_code,book_name,book_type,book_author,publish_press,publish_date,is_borrow) VALUES(?,?,?,?,?,?,?) ";

       int num = 0;

       try {

           num = queryRunner.update(sql, book.getBook_code(), book.getBook_name(), book.getBook_type(),

                  book.getBook_author(), book.getPublish_press(), book.getPublish_date(), book.getIs_borrow());

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

 

       return num;

    }

 

}

 

C3p0工具类

 

  1. 在Servlet中调用业务逻辑层

protected void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //设置request接收客户端中文参数乱码问题

       request.setCharacterEncoding("utf-8");

      

       // 通过jsp的内置对象 request获取 request.getParameter("标签name属性值")

       String code = request.getParameter("code");

       String bookname = request.getParameter("bookname");

       String booktypeid = request.getParameter("booktypeid");

       String press = request.getParameter("press");

       String author = request.getParameter("author");

       String publishdate = request.getParameter("publishdate");

 

       System.out.println("bookname"+bookname);

      

       // 创建book类的对象 将获取的值赋给对象

       Book book = new Book();

       book.setBook_author(author);

       book.setBook_code(code);

       book.setBook_name(bookname);

       book.setBook_type(Integer.parseInt(booktypeid));

       book.setIs_borrow(0);

       book.setPublish_press(press);

 

       // 格式需要转换

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

       Date date = null;

       try {

           date = sdf.parse(publishdate);

       } catch (ParseException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       book.setPublish_date(date);

 

       // 调用service

       BookService bookService = new BookServiceImpl();

       int num = bookService.addBook(book);

       // 根据受影响的行数 打印js提示 并跳转页面 PrintWrite 对象

       // response jsp9大内置对象之一 服务器给客户端的回馈 response

       // 设置response 响应的类型和编码格式 解决 提示中文乱码

       response.setContentType("text/html; charset=UTF-8");

       PrintWriter pWriter = response.getWriter();

       if (num > 0) {

           pWriter.write("<script type='text/javascript' >alert('新增成功');location.href='success.jsp'</script>");

       } else {

           pWriter.write("<script type='text/javascript' >alert('新增失败');location.href='error.jsp'</script>");

       }

 

    }

 

 

总结:

  1. 讲解了servlet
  2. 讲解mvc设计模式与三层架构的关系
  3. 实现了新增功能

作业:

  1. 新增未完成的请………
  2. 完成查询功能

明天讲解(带条件的分页查询)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值