zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记22:直接从请求到JSP & 获取Person的嵌套属性

    直接从请求到JSP,不经过servlet

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body { font-family:'comic sans ms',sans-serif; }
        </style>
    </head>
    <body>
    <form action="TestBean.jsp">
        <p>Name:</p>
        <p><input type="text" name="userName"></p>
        <p>ID#:</p>
        <p><input type="text" name="userID"></p>
        <p><input type="submit"></p>
    </form>
    </body>
    </html>

    我们现在需要在JSP中设置person的属性,

    使用Java脚本可以很容易地做到这一点;

      <body>
        <%-- 这个时候相当创建了一个引用名为 person 新的对象 --%>
        <jsp:useBean id="person" type="com.demo.Person" class="com.demo.Employee" />
        <%
          person.setName(request.getParameter("userName"));
        %>
      </body>

    甚至可以在JSP标准动作标签中插入Java脚本;

      <body>
        <%-- 这个时候相当创建了一个引用名为 person 新的对象,由于这个bean以前不存在,所以不能省略class! --%>
        <jsp:useBean id="person" type="com.demo.Person" class="com.demo.Employee">
          <jsp:setProperty name="person" property="name" value="<%= request.getParameter("userName") %>" />
        </jsp:useBean>
      </body>

    不过,不管怎么改,只要用到Java脚本,代码都显得特别冗长~

    有没有办法让代码好看一点呢?(想办法除掉JSP中的Java脚本!)

      <body>
        <%-- 这个时候相当创建了一个引用名为 person 新的对象,由于这个bean以前不存在,所以不能省略class! --%>
        <jsp:useBean id="person" type="com.demo.Person" class="com.demo.Employee">
          <jsp:setProperty name="person" property="name" param="userName" />
        </jsp:useBean>
      </body>

    JSP标准动作标签的param属性可以很好的解决这个问题,如上所示。

    事实上,你甚至不需要手动设置,只需要保证【html中的name】与【JavaBean的property】一致,赋值将自动完成!

    <form action="TestBean.jsp">
        <p>Name:</p>
        <p><input type="text" name="name"></p>
        <p>ID#:</p>
        <p><input type="text" name="userID"></p>
        <p><input type="submit"></p>
    </form>
      <body>
        <%-- 这个时候相当创建了一个引用名为 person 新的对象,由于这个bean以前不存在,所以不能省略class! --%>
        <jsp:useBean id="person" type="com.demo.Person" class="com.demo.Employee">
          <jsp:setProperty name="person" property="name" />
          <%-- 如果请求的参数名与property的值相同,就不需要手动设置这个属性 --%>
        </jsp:useBean>
      </body>

    如果你乐意,还可以更简单~

    <form action="TestBean.jsp">
        <p>Name:</p>
        <p><input type="text" name="name"></p>
        <p>ID#:</p>
        <p><input type="text" name="empID"></p>
        <p><input type="submit"></p>
    </form>
        <jsp:useBean id="person" type="com.demo.Person" class="com.demo.Employee">
          <jsp:setProperty name="person" property="*" />
        </jsp:useBean>

    ps:不用担心String与int类型不匹配,只要在【String、基本类型】的范畴内,类型转换将自动发生,不过万一得到一个类似于“xds232”的非法输入,那么程序很可能会挂掉,一种解决的办法是在客户端使用JavaScript检查后再发送。

    然而,JSP标准动作标记还不是尽善尽美!无脚本的故事还在继续。

    获取Person的嵌套属性

    创建一个狗类;

    package com.demo;
    
    public class Dog {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    给Person类加上狗属性;

    package com.demo;
    
    public class Person implements java.io.Serializable {
        private String name;
        private Dog dog;
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        public Person() {
    
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    我们通过一个Servlet把一个狗对象set到Person对象中;

    package com.demo;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    public class addDog extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Person p = new Person();
            p.setName("Jack");
    
            Dog dog = new Dog();
            dog.setName("Spike");
            p.setDog(dog);
    
            req.setAttribute("person", p);
    
            RequestDispatcher view = req.getRequestDispatcher("result.jsp");
            view.forward(req, resp);
        }
    }

    现在要在JSP页面中获得狗的名字,直接给出代码和运行结果:

    <%@ page import="com.demo.Person" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>result</title>
    </head>
    <body>
        <p>Dog Name:</p>
        <p>scriptlet out----->>>><%=((Person)request.getAttribute("person")).getDog().getName()%></p>
        <jsp:useBean id="person" class="com.demo.Person" scope="request" />
        <p>std action out----->>>><jsp:getProperty name="person" property="dog" /></p>
        <p>EL out----->>>>${person.dog.name}</p>
    </body>
    </html>

    看来不用脚本要取得狗的名字只能用EL了

  • 相关阅读:
    EventHandler 与常见的.Net预定义委托
    Consistent Hashing算法及相关技术
    全序, 分布式一致性的本质
    Paxos Made Simple
    Strong Consistency, 强一致性技术概述
    Chubby lock service for looselycoupled distributed systems
    AntiEntropy Protocols
    Mesos: A Platform for FineGrained Resource Sharing in the Data Center
    Spark A FaultTolerant Abstraction for InMemory Cluster Computing
    Vector Clocks, 时间向量
  • 原文地址:https://www.cnblogs.com/xkxf/p/7048910.html
Copyright © 2011-2022 走看看