约定优于编码
- <span style="color:#ff0000;">以下是第三步:实现功能</span>package com.itheima.request;
- import java.beans.IntrospectionException;
- import java.beans.PropertyDescriptor;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.lang.reflect.Method;
- import java.util.Enumeration;
- import java.util.Map;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.beanutils.BeanUtils;
- import com.itheima.domain.User;
- /*
- GET方式: URI?username=abc&password=123 username和password就是请求参数
- POST方式: 请求正文中 username=abc&password=123
- */
- public class RequestDemo3 extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- try {
- test7(request, response);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //实际开发中怎么玩:封装对象 借助第三方开发包 BeanUtils 终极版
- private void test7(HttpServletRequest request, HttpServletResponse response)
- throws IOException, Exception {
- User user = new User();
- System.out.println("封装前:"+user);
- //表单的字段名和User中的属性名一致
- BeanUtils.populate(user, request.getParameterMap());
- System.out.println("封装后:"+user);
- }
- //实际开发中怎么玩:封装对象 借助第三方开发包 BeanUtils
- private void test6(HttpServletRequest request, HttpServletResponse response)
- throws IOException, Exception {
- User user = new User();
- System.out.println("封装前:"+user);
- //表单的字段名和User中的属性名一致
- Map<String,String[]> map = request.getParameterMap();//key:表单中input的name value:请求参数的值数组
- for(Map.Entry<String, String[]> me:map.entrySet()){
- String paramName = me.getKey();
- String paramValues[] = me.getValue();
- BeanUtils.setProperty(user, paramName, paramValues);//调用对应的setter方法
- }
- System.out.println("封装后:"+user);
- }
- //实际开发中怎么玩:封装对象(技术点:反射+内省) 参考:java基础加强
- private void test5(HttpServletRequest request, HttpServletResponse response)
- throws IOException, Exception {
- User user = new User();
- System.out.println("封装前:"+user);
- //表单的字段名和User中的属性名一致
- Map<String,String[]> map = request.getParameterMap();//key:表单中input的name value:请求参数的值数组
- for(Map.Entry<String, String[]> me:map.entrySet()){
- String paramName = me.getKey();
- String paramValues[] = me.getValue();
- //调用User中对应的写属性:比如当前username,需要调用setUsername(paramValues);
- PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class);//属性描述器:就是得getter或setter方法的类
- Method method = pd.getWriteMethod();// setter方法
- if(paramValues!=null){
- if(paramValues.length==1){
- method.invoke(user, paramValues);//有一个数组(参考反射main方法)
- }else{
- method.invoke(user, (Object)paramValues);
- }
- }
- }
- System.out.println("封装后:"+user);
- }
- //实际开发中怎么玩:封装对象(技术点:反射+内省) 参考:java基础加强
- private void test4(HttpServletRequest request, HttpServletResponse response)
- throws IOException, Exception {
- User user = new User();
- System.out.println("封装前:"+user);
- //表单的字段名和User中的属性名一致
- Enumeration e = request.getParameterNames();
- while(e.hasMoreElements()){
- String paramName = (String) e.nextElement();//每一个form中的input域的name 和User中的属性一致
- String paramValues[] = request.getParameterValues(paramName);
- //调用User中对应的写属性:比如当前username,需要调用setUsername(paramValues);
- PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class);//属性描述器:就是得getter或setter方法的类
- Method method = pd.getWriteMethod();// setter方法
- if(paramValues!=null){
- if(paramValues.length==1){
- method.invoke(user, paramValues);//有一个数组(参考反射main方法)
- }else{
- method.invoke(user, (Object)paramValues);
- }
- }
- }
- System.out.println("封装后:"+user);
- }
- //获取所有的请求参数
- private void test3(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- Enumeration e = request.getParameterNames();//获取所有请求参数名
- while(e.hasMoreElements()){
- String paramName = (String)e.nextElement();//请求参数名
- String values [] = request.getParameterValues(paramName);
- out.write(paramName+"=");
- for(String v:values){
- out.write(v+",");
- }
- out.write("<br/>");
- }
- }
- //为什么返回的是String或String[]:用户的所有输出都是字符串
- //获取重名的请求参数
- private void test2(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- String passwords[] = request.getParameterValues("password");
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- for(String p:passwords)
- out.write(p+"<br/>");
- }
- //获取单一的请求参数:重名的特例
- private void test1(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- String username = request.getParameter("username");
- String password = request.getParameter("password");
- String code = request.getParameter("code");
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- out.write(username+":"+password+":"+code);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
第一步:表单的编写
- <!DOCTYPE html>
- <html>
- <head>
- <title>用户登录</title>
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="this is my page">
- <meta http-equiv="content-type" content="text/html; charset=UTF-8">
- <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
- </head>
- <body>
- 先不要输出中文<br/>
- <form action="/day08_01_request/servlet/RequestDemo4" method="post">
- 用户名:<input type="text" name="username"/><br/>
- 密码:<input type="password" name="password"/><br/>
- 确认密码:<input type="password" name="password"/><br/>
- 验证码:<input type="text" name="code" size="3"/>
- <img id="image1" src="/day08_00_response/servlet/ResponseDemo1"/><a href="javascript:chanageImage()">看不清</a>
- <br/>
- <input type="submit" value="登录"/>
- </form>
- <script type="text/javascript">
- function chanageImage(){
- //如果地址一样,浏览器并不会发出请求
- document.getElementById("image1").src="/day08_00_response/servlet/ResponseDemo1?"+new Date().getTime();
- }
- </script>
- </body>
- </html>
第二步:JavaBean的编码
- package com.itheima.domain;
- import java.util.Arrays;
- //约定优于编码:
- //约定:属性与表单的字段名保持一致
- public class User {
- private String username;//字段
- private String[] password;
- private String code;
- //读属性:名称:username
- public String getUsername() {
- return username;
- }
- //写属性:名称:username
- public void setUsername(String username) {
- this.username = username;
- }
- public String[] getPassword() {
- return password;
- }
- public void setPassword(String[] password) {
- this.password = password;
- }
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- @Override
- public String toString() {
- return "User [username=" + username + ", password="
- + Arrays.toString(password) + ", code=" + code + "]";
- }
- }