- Servlet
-
- Servlet
Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
- 客户端发送请求至服务器端;
- 服务器将请求信息发送至 Servlet;
- Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
- 服务器将响应返回给客户端。
Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包
一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序
工作模式
客户端发送请求至服务器
服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端
- 怎么使用Servlet
- 创建包存放servlet(com.demo. Servlet)
- 编写Servlet
右击包ànewàServlet
点击Finish
- Servlet生命周期
- 客户端请求该 Servlet;
- 加载 Servlet 类到内存;
- 实例化并调用init()方法初始化该 Servlet;
- service()(根据请求方法不同调用doGet() 或者 doPost())。
init()方法 在第一次访问该Servlet的时候调用(只会调用一次)
doget()/doPost() 每访问一次,根据请求的方式 调用一次(每访问一次调用一次)
destroy() 正常关闭服务器调用(右击server点击stop)
-
- JSP开发模型
- JSP Model
- JSP Model
- JSP Model即JSP的开发模型。Sun公司为JSP技术提供了两种开发模型:JSP Model1和JSP 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是一种设计模式
三层是一种编程思想
两者不要混为一谈,作用都是为了解耦
两者的关系见下图
-
- 实现贯穿案例中的新增功能
思路分析
代码编写:
- 导入jar
- 创建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> |
- 创建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); }
} |
- 修改add.jsp from表单的action地址为BookServlet对应的url
- 获取页面的参数的值
- 编写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工具类
- 在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>"); }
}
|
总结:
- 讲解了servlet
- 讲解mvc设计模式与三层架构的关系
- 实现了新增功能
作业:
- 新增未完成的请………
- 完成查询功能
明天讲解(带条件的分页查询)