直接从请求到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了