第7章:JavaBean、Servlet 与 MVC——从 JSP 页面开发走向规范项目
一、前言很多同学刚学 JSP 时写代码都是这种风格% String username request.getParameter(username); String password request.getParameter(password); if(admin.equals(username) 123.equals(password)){ % h2登录成功/h2 % }else{ % h2登录失败/h2 % } %刚开始这样写没问题。因为页面少功能简单逻辑不复杂但一旦项目稍微大一点就会立刻出问题JSP 里全是 Java 代码HTML 和业务逻辑混在一起一个页面又接收参数、又判断、又查数据、又输出结果后期改功能特别痛苦所以 Web 项目开发到后面一定会走向分工页面显示交给谁JSP业务逻辑交给谁JavaBean请求控制和跳转交给谁Servlet这就是本章要讲清楚的核心。二、为什么不建议把所有代码都写在 JSP 里讲稿里其实已经给了很明确的方向使用 JavaBean 可以达到显示与业务的分离。显示JSP业务JavaBean。JAVA 开发人员专注于具体业务的开发而 JSP 开发人员专注于显示效果的开发。这两句话非常重要。1. JSP 最擅长什么JSP 的优点讲稿总结得很直接JSP 优点开发前台界面方便做 UI 开发容易。也就是说JSP 最适合干的是写页面结构显示数据做简单输出控制页面效果它不适合承担太多复杂业务处理。2. 为什么 JSP 不适合堆太多业务逻辑因为一旦业务逻辑复杂你会遇到这些问题页面特别乱重复代码很多不利于复用美工/前端和 Java 开发没法分工后期修改一处影响很多页面所以更规范的方式就是让 JSP 负责“看起来怎么样”让 JavaBean/Servlet 负责“到底怎么处理”三、JavaBean 到底是什么讲稿里给的定义非常直接JavaBean 就是一个 Java 类只是没有图形显示代码主要完成基本业务逻辑。JavaBean 可以使用 Java 的封装、继承、多态。使用 JavaBean 封装许多可重复调用的代码。所以你可以先把 JavaBean 理解成专门拿来封装数据和业务逻辑的普通 Java 类1. JavaBean 最核心的作用作用一封装数据比如用户信息、学生信息、图书信息。作用二封装业务逻辑比如登录验证数据处理结果计算数据库操作的中间逻辑作用三提高复用性同一段业务逻辑不必在多个 JSP 页面里重复写。2. 为什么 JavaBean 很重要讲稿里甚至说得比较重不会 JavaBean 的开发人员不能称为 J2EE 开发人员。这句话当然带点课堂强调意味但核心意思没错JavaBean 是 JSP/Java Web 开发里最基础的业务封装手段之一。四、JavaBean 的编写要求这部分讲稿列得非常清楚几乎就是考试点。1. 必须放在一个包中例如package jlnu.zjh;2. 必须是public class例如public class SimpleBean { }3. 属性必须封装也就是属性一般写成private不能随便直接暴露例如private String name; private int age;4. 通过 setter / getter 设置和获取属性例如public void setName(String name){ this.name name; } public String getName(){ return name; }5. 如果要通过 JSP 标签调用必须有无参构造方法讲稿明确强调使用 JSP 标签去调用 JavaBean 时必须有一个无参构造方法。五、一个最基础的 JavaBean 例子下面先写一个最标准、最适合入门的 JavaBean。SimpleBean.javapackage jlnu.zjh; public class SimpleBean { private String name; private String password; private int age; public SimpleBean() { } public String getName() { return name; } public void setName(String name) { this.name name; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public int getAge() { return age; } public void setAge(int age) { this.age age; } }这个类就符合 JavaBean 的基本规范在包里public class属性私有有 getter / setter有无参构造六、JavaBean 文件放在哪里讲稿里明确说将 JavaBean 编译好的.class文件拷贝到WEB-INF/classes文件夹之下如果没有则可以自己建立。WEB-INF/classes本质上是一个 classpath 路径。所以在传统 JSP/Tomcat 课程环境下你可以这样理解源文件写成.java编译后得到.class放置位置放到WEB-INF/classes/包名路径/例如WEB-INF/classes/jlnu/zjh/SimpleBean.class七、JSP 中如何调用 JavaBean讲稿里给出的标准标签是jsp:useBean idsb scopepage classjlnu.zjh.SimpleBean/这行代码特别重要。1.id表示实例化对象的名字例如idsb后面你就用sb代表这个 Bean 对象。2.scope表示作用范围例如scopepage也可以是pagerequestsessionapplication这和前一章四大作用域是对应的。3.class表示 JavaBean 的完整类名例如classjlnu.zjh.SimpleBean也就是包名 类名4. 最完整的调用示例% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % jsp:useBean idsb scopepage classjlnu.zjh.SimpleBean/ % sb.setName(张三); sb.setPassword(123456); sb.setAge(20); % h2姓名% sb.getName() %/h2 h2密码% sb.getPassword() %/h2 h2年龄% sb.getAge() %/h2这就是最基础的“JSP 调 JavaBean”。八、jsp:setProperty和jsp:getProperty到底怎么用这一块是讲稿里的重点。讲稿明确说使用 JavaBean 可以替代掉一切 setter 方法调用。jsp:setProperty namesb property*/可以自动匹配。参数名与 Bean 属性名一致时可以通过反射自动找到对应的setXxx()方法。1. 先看手动 setter 的写法jsp:useBean idsb scopepage classjlnu.zjh.SimpleBean/ % sb.setName(request.getParameter(name)); sb.setPassword(request.getParameter(password)); sb.setAge(Integer.parseInt(request.getParameter(age))); %这当然能用但写起来比较繁琐。2. 用setProperty自动设置jsp:useBean idsb scopepage classjlnu.zjh.SimpleBean/ jsp:setProperty namesb property*/这句的意思是自动把表单参数填充到 Bean 中同名属性里前提是表单的nameJavaBean 的属性名setter 方法名三者要匹配。3. 为什么它能自动匹配讲稿里给出的解释是根本原因是使用 Java 的反射机制根据参数名称找到相应的方法。比如参数名为name就会自动找到setName()。你现在不用深究反射细节只要记住这个结论表单参数名和 Bean 属性名一致时property*特别好用。4.setProperty的几种写法讲稿列了几种自动匹配jsp:setProperty namesb property*/设置指定属性jsp:setProperty namesb propertyname/指定参数来源jsp:setProperty namesb propertyname parampassword/直接指定固定值jsp:setProperty namesb propertyname valuehello/5.getProperty的用法虽然讲稿重点更偏向setProperty但 JSP 中通常也会配套用jsp:getProperty namesb propertyname/例如jsp:useBean idsb scopepage classjlnu.zjh.SimpleBean/ jsp:setProperty namesb property*/ h2姓名jsp:getProperty namesb propertyname//h2 h2年龄jsp:getProperty namesb propertyage//h2九、JavaBean 的智能之处自动类型转换讲稿里专门强调了这一点使用 JavaBean 的setProperty方法可以自动将传递过来的只有数字的字符串变为整型再赋值给具体属性。这非常适合初学者理解。1. 比如表单传过来的是age 20这是字符串。2. 但如果你的 Bean 里写的是private int age; public void setAge(int age){ ... }那么使用jsp:setProperty namesb property*/时JSP 容器会尝试自动把20转成int 20。所以这一点比你手动写request.getParameter()更省事。十、JSP JavaBean模式1 的优点和缺点讲稿里对这种模式讲得非常清楚。1. 优点讲稿总结的优点有JAVA 人员与美工开发人员分工明确JSP 中可以去掉大量 Java 代码JSP 负责前台显示JavaBean 负责后台业务逻辑开发速度较快这几点都很好理解。2. 缺点讲稿也直接指出JSP 与 JavaBean 紧密耦合在一起程序开发完成之后不利于维护。这就是问题所在。例如JSP 直接 new / 调 Bean页面里知道太多业务细节改 Bean 可能影响很多 JSP美工和 Java 逻辑仍然容易互相牵制讲稿还特别举了很真实的团队协作矛盾美工说你先开发好 Java 程序我再做页面开发说你先做好页面我再写逻辑。这本质上就是耦合过紧。十一、为什么需要 Servlet这时 Servlet 就登场了。讲稿对 Servlet 的定位非常明确Servlet 优点是 Java 程序安全性高性能也高Servlet 也可以像 JSP 一样接收用户请求参数但 Servlet 的缺点是显示不方便。所以你可以把 Servlet 理解成专门负责“中间调度”的控制器1. Servlet 最擅长什么接收请求参数做逻辑判断调用 JavaBean跳转到 JSP 页面这和讲稿总结的最佳实践完全一致Servlet 中最好只有以下几种代码接收参数、调用 JavaBean、进行跳转、做一些简单逻辑判断。这句话非常值得背。2. Servlet 不适合什么Servlet 不适合写复杂页面显示。因为它本质上是 Java 类不像 JSP 那样天然适合写 HTML 界面。所以最合理的分工就是Servlet 负责控制JavaBean 负责业务JSP 负责显示十二、MVC 到底是什么这就是本章的最终目标。讲稿里给出的链路非常清楚JSP → Servlet → JavaBeanJSP 跳转到 Servlet 可以通过表单提交或超链接Servlet 跳转到 JSP 可以。这其实就是 MVC 思想在课程里的落地版。1. MVC 三层分工M Model模型这里主要对应JavaBeanDAO业务逻辑数据处理V View视图这里主要对应JSP 页面页面显示用户界面C Controller控制器这里主要对应Servlet接收请求调用 Model决定跳转到哪个 JSP2. 为什么 MVC 更好讲稿明确说使用 MVC 开发程序代码稍微复杂但 Servlet 根据 JavaBean 返回内容进行跳转JSP 与 JavaBean 之间没有特别明显的直接关系。这说明MVC 初学时会觉得麻烦但它把耦合拆开了后期更容易维护和扩展十三、一个最基础的 MVC 流程图思维你可以把登录功能想成这样第一步JSP 显示登录表单用户在页面中输入用户名和密码。第二步表单提交到 ServletServlet 接收参数req.getParameter(username) req.getParameter(password)第三步Servlet 调用 JavaBeanJavaBean 去做验证逻辑。第四步Servlet 根据结果跳转成功 → success.jsp失败 → fail.jsp这就是最经典的 MVC 基础流程。十四、Servlet 跳转到 JSP 怎么写讲稿里给了非常标准的代码req.getRequestDispatcher(mvcdemo.jsp).forward(req,resp);并明确指出Servlet 跳转到 JSP 的服务器端跳转指令就是这个。1. 示例 Servletpackage zjh.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MVCServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { this.doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { req.setAttribute(name, zhaojh); req.getRequestDispatcher(mvcdemo.jsp).forward(req, resp); } }这段代码和讲稿中的 MVCServlet 示例是一致的。2. JSP 页面接收显示mvcdemo.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % h2姓名% request.getAttribute(name) %/h2这就形成了Servlet 负责放值JSP 负责显示值十五、一个完整的 MVC 登录小案例下面我给你写一个最适合课程理解的精简版。1. JSP登录页login.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % html head title登录页面/title /head body form actionlogin.do methodpost 用户名input typetext nameusernamebrbr 密码input typepassword namepasswordbrbr input typesubmit value登录 /form /body /html2. JavaBeanUserBean.javapackage jlnu.zjh; public class UserBean { private String username; private String password; public UserBean() { } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public boolean checkLogin() { return admin.equals(username) 123456.equals(password); } }3. ServletLoginServlet.javapackage jlnu.zjh; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { this.doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); UserBean user new UserBean(); user.setUsername(username); user.setPassword(password); if(user.checkLogin()) { req.setAttribute(username, username); req.getRequestDispatcher(success.jsp).forward(req, resp); } else { req.getRequestDispatcher(fail.jsp).forward(req, resp); } } }4. 成功页success.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % h2登录成功欢迎你% request.getAttribute(username) %/h25. 失败页fail.jsp% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 % h2登录失败用户名或密码错误/h2十六、这个 MVC 案例到底体现了什么你一定要能说清楚这 3 层各自干了什么。JSP 做了什么提供登录表单显示成功/失败页面Servlet 做了什么接收参数创建 Bean调用 Bean 的业务方法决定跳转哪一个 JSPJavaBean 做了什么封装用户数据提供登录验证逻辑这就是最标准的课程级 MVC 分工。十七、DAO 是什么为什么讲稿里提到了讲稿后面顺带提到查询过程可以封装成 DAO 接口、DAO 实现类、工厂类。这说明课程最后其实已经在往更规范的项目结构靠了。1. DAO 的作用DAO Data Access Object简单理解专门负责和数据库打交道比如查询用户插入学生信息删除图书修改成绩如果把数据库代码全写在 JSP 或 Servlet 里也会很乱。所以更规范的方式是JSP显示Servlet控制JavaBean业务对象DAO数据库访问2. 你现在阶段怎么理解就够了你现在不用把 DAO 学太深先记住JavaBean 不一定只保存属性也可以逐渐承担业务逻辑而真正数据库访问再往下可以拆到 DAO。这就是项目越来越规范的方向。十八、JSP JavaBean 和 MVC 到底怎么选讲稿给出了很明确的结论。1. JSP JavaBean模式1优点写得快适合小项目适合一次性作业人少时方便缺点JSP 和 JavaBean 耦合紧后期维护麻烦页面和业务边界还不够清晰讲稿直接说适合于一次开发完成而且团队成员较少时使用。2. JSP Servlet JavaBeanMVC优点分工明确JSP 更干净逻辑更清晰更利于维护和扩展缺点代码结构更复杂初学时会觉得麻烦所以课程学习层面可以这样记小作业JSP JavaBean 就够用稍微规范一点的项目上 MVC十九、本章最容易混淆的 8 个点1. JavaBean 不是“特殊语法”它本质上就是符合规范的 Java 类。2. JSP 可以调用 JavaBean但这不代表 JSP 应该写满业务逻辑JSP 主要还是负责显示。3. Servlet 不是拿来写漂亮页面的Servlet 适合控制不适合直接写复杂 HTML。4.jsp:setProperty property*不是魔法它只是根据参数名和属性名自动匹配 setter。5. 表单参数名和 Bean 属性名不一致时自动匹配会失败这是property*最容易踩的坑。6. JavaBean 被 JSP 标签调用时需要无参构造这是硬要求。7. MVC 更规范但代码会比纯 JSP 复杂讲稿明确提到这一点。8. Servlet 最好只保留四类代码接收参数调用 JavaBean跳转少量逻辑判断这句话非常值得背。二十、本章你必须背下来的结论JavaBean 本质上是普通 Java 类用于封装数据和业务逻辑。JavaBean 的基本要求包括放在包中、public class、属性封装、getter/setter、无参构造。JSP 通过jsp:useBean调用 JavaBean。jsp:setProperty name对象 property*/可以自动把表单参数映射到 Bean 属性。自动映射成功的前提是参数名与属性名一致。使用 JavaBean 可以实现显示与业务分离JSP 负责显示JavaBean 负责业务。JSP JavaBean 开发快但耦合紧不利于维护。Servlet 适合接收参数、调用 JavaBean、做跳转和简单逻辑判断。MVC 中JSP 是 ViewServlet 是 ControllerJavaBean/DAO 是 Model。这个分工是从讲稿整体结构可直接归纳出来的。更规范的 Web 项目开发应尽量让 JSP、Servlet、JavaBean 各司其职。二十一、本章练习题练习1自己写一个StudentBean包含nameagescore并写出 getter / setter。练习2写一个 JSP 页面用jsp:useBean调用StudentBean并手动给属性赋值后显示出来。练习3写一个表单页面输入姓名和年龄提交到结果页用jsp:setProperty property*/自动给 Bean 赋值并显示。练习4写一个最简单的登录 MVC 案例login.jspLoginServletUserBeansuccess.jspfail.jsp练习5思考并回答为什么 JSP JavaBean 适合小作业而 MVC 更适合规范项目二十二、本章小结这一章你学到的其实不是几个标签和类而是一种更成熟的开发思想。你现在应该已经明白JSP 不该什么都干JavaBean 的意义不只是“存数据”更重要的是封装和复用Servlet 的价值在于控制流程和解耦MVC 的本质不是“多写几个文件”而是让显示、控制、业务三部分各自独立到这里这套《网络程序设计》7章主线其实就完整了。你已经从浏览器 / 服务器 / TomcatHTML / 表单 / 表格JSP 语法request / responseCookie / Session一路走到了JavaBeanServletMVC这基本就是一门 Web 入门课最核心的知识骨架。

相关新闻

最新新闻

日新闻

周新闻

月新闻