上一篇博文写到模式一:JSP+JavaBean

链接地址:http://wxmimperio.coding.io/?p=155

JSP中两种模式的总结

链接地址:http://wxmimperio.coding.io/?p=207


这篇对模式二:JSP+Servlet+JavaBean,做一个小的总结。

模式二中结合了JSP和Servlet,充分利用了两个技术的原有特点。是最典型的MVC设计模式,将输入、处理、输出分成视图、模型和控制器,各自执行各自的任务。请求会由前面的Servlet接受并处理后,重新定向到JSP页面。在Servlet作为控制器时,每个Servlet通常只实现很少的一部分功能,多个Servlet控制器就可以结合起来完成复杂的逻辑任务。这样的好处是Servlet的重用性很好利用,一个副作用就是可能会导致请求相应加长。在此模式里,JavaBean作为模型的角色,它充当JSP和Servlet通信的中间工具。Setvlet处理完成设置Bean的属性,JSP读取此Bean的属性,然后进行显示。

在项目开发过程中,前端页面设计者可以方便地开发JSP页面,而Servlet则更适合后台开发,因为Servlet技术需要更多的Java编程。


实例说明:

这里写一个留言并查看的小例子帮助理解这种模式,会用到JDBC编程、SQL、Servlet的相关知识,这里不做相关介绍。

(开发环境是Idea+Tomcat+Mysql,提前做好相应jar包的引入)

数据库脚本:

  • create database messages;
  • use messages;
  • #留言信息
  • create table message(
  • title varchar(20) not null,                #标题
  • username varchar(20) not null,      #名字
  • content varchar(20) not null,          #内容
  • mail varchar(20)                             #邮箱
  • );

1.添加留言的Servlet(AddMessageServlet.java)

  • package jsp_javabean_servlet;
  • import javax.servlet.*;
  • import javax.servlet.http.*;
  • import java.io.*;
  • import java.sql.*;
  • public class AddMessageServlet extends HttpServlet{
  • private Connection con;
  • /**
  • * 创建数据库连接
  • */
  • public AddMessageServlet() {
  • try {
  • Class.forName("com.mysql.jdbc.Driver");
  • String url = "jdbc:mysql://localhost:3306/messages?user=root&password=root";
  • con = DriverManager.getConnection(url);
  • } catch (ClassNotFoundException e) {
  • e.printStackTrace();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • /**
  • * 接受get请求,执行数据库操作,把视图发送到下一个页面
  • */
  • public void doGet(HttpServletRequest request,HttpServletResponse response)
  • throws IOException,ServletException {
  • //接收请求的参数
  • request.setCharacterEncoding("gbk");
  • String name = request.getParameter("name");
  • String mail = request.getParameter("email");
  • String title = request.getParameter("title");
  • String content = request.getParameter("content");
  • //插入留言
  • try {
  • String  sql = "insert into message(title,username,content,mail) values(?,?,?,?)";
  • PreparedStatement stm = con.prepareStatement(sql);
  • stm.setString(1,title);
  • stm.setString(2,name);
  • stm.setString(3,content);
  • stm.setString(4,mail);
  • try {
  • stm.executeUpdate();
  • } catch (Exception e){}
  • con.close();
  • //把视图发送给目标
  • RequestDispatcher requestDispatcher =
  • request.getRequestDispatcher("/viewMessages_servlet");
  • requestDispatcher.forward(request,response);
  • }catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • /**
  • * doPost请求
  • */
  • public void doPost(HttpServletRequest request,HttpServletResponse response)
  • throws IOException,ServletException {
  • doGet(request,response);
  • }
  • }

2.留言浏览的Servlet(ViewMessageServlet.java)

  • package jsp_javabean_servlet;
  • import javax.servlet.*;
  • import javax.servlet.http.*;
  • import java.io.*;
  • import java.sql.*;
  • import java.util.*;
  • public class ViewMessageServlet extends HttpServlet{
  • private Connection con;
  • /**
  • * 接受get请求,执行数据库操作,结果保存到request中
  • * 把视图发送到下一个页面
  • */
  • public void doGet(HttpServletRequest request,HttpServletResponse response)
  • throws IOException,ServletException{
  • Collection ret = new ArrayList();
  • try {
  • Statement stm = con.createStatement();
  • ResultSet result = stm.executeQuery("select count(*) from message");
  • //统计留言数量
  • int message_count = 0;
  • if(result.next()) {
  • message_count = result.getInt(1);
  • result.close();
  • }
  • //从数据库中读取留言信息
  • if(message_count  > 0) {
  • result = stm.executeQuery("select * from message");
  • while (result.next()) {
  • String title = result.getString("title");
  • String name = result.getString("username");
  • String mail = result.getString("mail");
  • String content = result.getString("content");
  • MessageVO message = new MessageVO();
  • message.setName(name);
  • message.setTitle(title);
  • message.setEmail(mail);
  • message.setContent(content);
  • ret.add(message);
  • }
  • result.close();
  • stm.close();
  • }
  • //将执行结果发送到目标
  • request.setAttribute("messages",ret);
  • RequestDispatcher requestDispatcher =
  • request.getRequestDispatcher("viewMessage.jsp");
  • requestDispatcher.forward(request,response);
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • /**
  • * doPost请求
  • */
  • public void doPost(HttpServletRequest request,HttpServletResponse response)
  • throws IOException,ServletException{
  • doGet(request,response);
  • }
  • /**
  • * 数据库连接
  • */
  • public ViewMessageServlet() {
  • try {
  • Class.forName("com.mysql.jdbc.Driver");
  • String url = "jdbc:mysql://localhost:3306/messages?user=root&password=root";
  • con = DriverManager.getConnection(url);
  • } catch (ClassNotFoundException e) {
  • e.printStackTrace();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • }

3.用来set和get数据的JavaBean(MessageVO.java)

  • package jsp_javabean_servlet;
  • /**
  • * 这个JavaBean,表示留言的数据
  • */
  • public class MessageVO implements java.io.Serializable {
  • //定义留言的相关参数
  • private String name,email,title,content;
  • private java.sql.Date date;
  • //get和set方法
  • public void setName(String name) {
  • this.name = name;
  • }
  • public String getName() {
  • return this.name;
  • }
  • public void setEmail(String email) {
  • this.email = email;
  • }
  • public String getEmail() {
  • return  this.email;
  • }
  • public void setTitle(String title) {
  • this.title = title;
  • }
  • public String getTitle() {
  • return  this.title;
  • }
  • public void setContent(String content) {
  • this.content = content;
  • }
  • public String getContent() {
  • return this.content;
  • }
  • }

4.web.xml的配置文件

  • <display-name>jsp_javabean_servlet</display-name>
  • <description>jsp_javabean_servlet</description>
  • <servlet>
  • <servlet-name>ViewMessageServlet</servlet-name>
  • <servlet-class>jsp_javabean_servlet.ViewMessageServlet</servlet-class>
  • </servlet>
  • <servlet>
  • <servlet-name>AddMessageServlet</servlet-name>
  • <servlet-class>jsp_javabean_servlet.AddMessageServlet</servlet-class>
  • </servlet>
  • <servlet-mapping>
  • <servlet-name>ViewMessageServlet</servlet-name>
  • <url-pattern>/viewMessages_servlet</url-pattern>
  • </servlet-mapping>
  • <servlet-mapping>
  • <servlet-name>AddMessageServlet</servlet-name>
  • <url-pattern>/addMessages_servlet</url-pattern>
  • </servlet-mapping>

5.留言输入的html(index.html)

  • <html>
  • <head lang="en">
  • <meta charset="gbk">
  • <title></title>
  • </head>
  • <body>
  • <td><table align="center" border="1" cellspacing="0" cellpadding="0">
  • <form action="addMessages_servlet" method="post">
  • <tr>
  • <td>姓名:</td>
  • <td><input type="text" name="name" size="25"></td>
  • </tr>
  • <tr>
  • <td>E-mail:</td>
  • <td><input type="text" name="email" size="25"></td>
  • </tr>
  • <tr>
  • <td>主题:</td>
  • <td><input type="text" name="title" size="25"></td>
  • </tr>
  • <tr>
  • <td >留言:</td>
  • <td><input type="text" name="content" size="25"></td>
  • </tr>
  • <tr><td colspan="3">
  • <table align="center" width="100%" cellspacing="0" cellpadding="0">
  • <tr>
  • <td align="center"><input type="submit" value="提交"></td>
  • <td align="center"><a href="viewMessages_servlet">查看留言</a></td>
  • <td align="center"><input type="reset" value="重新填写"></td>
  • </tr>
  • </table>
  • </td></tr>
  • </form>
  • </table></td>
  • </body>
  • </html>

6.显示留言的JSP(viewMessage.jsp)

  • <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • <%@ page import="java.sql.*,jsp_javabean_servlet.*,java.util.*" %>
  • <html>
  • <head>
  • <title></title>
  • </head>
  • <body>
  • <p align="center">所有留言</p>
  • <hr>
  • <%
  • int messgae_count = 1;
  • Collection messages = (Collection)request.getAttribute("messages");
  • Iterator it = messages.iterator();
  • while (it.hasNext()) {
  • MessageVO message = (MessageVO)it.next();
  • %>
  • <table width="30%" align="center" border="1" cellpadding="0" cellspacing="0">
  • <tr>
  • <td>主题:</td>
  • <td><%=message.getTitle()%></td>
  • </tr>
  • <tr>
  • <td>留言人:</td>
  • <td><%=message.getName()%></td>
  • </tr>
  • <tr>
  • <td>邮箱:</td>
  • <td><%=message.getEmail()%></td>
  • </tr>
  • <tr>
  • <td>楼层:
  • <%
  • out.println("("+messgae_count+")");
  • %>
  • </td>
  • <td><%=message.getContent()%></td>
  • </tr>
  • </table>
  • <%
  • out.println("<hr>");
  • messgae_count++;
  • }
  • %>
  • <p align="center"><a href="index.html">我要留言</a></p>
  • </body>
  • </html>

运行 

在浏览器里输入index.html的地址,填入留言信息点击提交,会跳转到viewMessage.jsp页面显示信息,其实已经经过两个Servlet的处理。

index.html填写留言页面:

viewMessage.jsp显示留言页面:

参考:JSP应用开发详解(第三版)

JSP中使用的模式——JSP+Servlet+JavaBean的更多相关文章

  1. JSP中使用的模式——JSP+JavaBean

    模式二:JSP+Servlet+JavaBean 链接地址:http://wxmimperio.coding.io/?p=189 JSP中两种模式的总结 链接地址:http://wxmimperio. ...

  2. JSP中两种模式的总结

    运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...

  3. jsp中的out对象 和 servlet中的response.getOutputStream()

    web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突. 即Servlet规范说明,不能既调用 respon ...

  4. jsp中的@include与jsp:include区别详解

    1 前言 搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式 <%@include file="xxx.jsp"%> <jsp:include ...

  5. jsp中java代码、jsp代码、js代码执行的顺序

    原理: jsp中的Java代码 -- 服务器端代码 js代码 -- 客户端代码 java是在服务器端运行的代码,jsp在服务器的servlet里运行,而JavaScript和html都是在浏览器端运行 ...

  6. 【JSP中引入文件】JSP中获取根路径+引用js文件

    在jsp界面中经常需要引入js.css等文件,通常都需要先获取项目根路径,然后再引入文件. 例如: 项目路径如下,需要在index.jsp中引入FusionCharts相关的js.css等: inde ...

  7. JSP开发模式2_JSP/Servlet/JavaBean(简单注册功能)

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegisterBean {    privat ...

  8. JSP三大指令 /9大内置对象 /Javabean / EL

    一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xxx". ...

  9. jsp2.0+中的标签文件,JSP Fragment技术

    刚进新公司不久,今天在看到项目中用到了.tag文件.刚开始我还以为这个是第三方类似freemarker的模板技术.问了下项目组的其他人员,原来这是jsp2.0以来就有的JSP Fragment技术.以 ...

随机推荐

  1. Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题解决办法

    解决Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题   PyQt4在Windows中使用了DirectX作为加速,不过,PyQt4没有使用最新 ...

  2. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  3. ASP.NET Web API(一):使用初探,GET和POST数据

    概述 REST(Representational State Transfer表述性状态转移)而产生的REST API的讨论越来越多,微软在ASP.NET中也添加了Web API的功能 项目建立 在安 ...

  4. HDU2017JAVA

    字符串统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. JavaScript异步操作

    //伪代码写法,只用来记录结构 function test(){ var dtd=$.Deferred(); if(成功){ dtd.resolve(data1,data2); //传递参数 } el ...

  6. DOS和UNIX文本文件之间相互转换的方法

    在Unix/Linux下可以使用file命令查看文件类型,如下: file dosfile.txt 使用dos2unix 一般Linux发行版中都带有这个小工具,只能把DOS转换为UNIX文件,命令如 ...

  7. apache目录及文件讲解

    apache目录下bin,conf,htdocs,logs,modules讲解    bin:        ab  压力测试工具        apachectl  启动命令        apxs ...

  8. centos 6.3 编译安装 nginx +mysql + php

    这篇文章是对另一篇文章的整理,作为记录收藏 1,配置防火墙,开启80端口.3306端口 配置iptables,开启80端口.3306端口 vi /etc/sysconfig/iptables -A I ...

  9. spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二)

    spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二) >>>>>>>>>>>>>>&g ...

  10. 11.9 noip模拟试题

    NOIP2016 模拟赛——那些年,我们学过的文化课背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, 而 ...