• Java——HTTPServletRequest的使用


    HTTPServletRequest

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

    service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

    TomCat下Servlet的请求和响应流程

    获取HTTP请求

    1、获取请求行

    String uri = request.getRequestURI();   // 获取uri
    System.out.println("uri:"+uri);     // uri:/WEB152/request
    
    StringBuffer url = request.getRequestURL();     // 获取url
    System.out.println("url:"+url);     // url:http://127.0.0.1:8080/WEB152/request
    
    String Contextpath = request.getContextPath();  // 获取当前Web应用的名称***
    System.out.println("Contextpath:"+Contextpath);     // Contextpath:/WEB152
    
    String queryString = request.getQueryString();      // 获取get提交url地址后的参数字符串
    System.out.println("queryString:"+queryString);     // queryString:username=x5456&passwd=123
    

    2、获取请求头

    String header = request.getHeader("User-Agent");    // 获取请求头
    System.out.println(header);     // PostmanRuntime/7.1.1
    
    Enumeration<String> HeaderNamesList = request.getHeaderNames();     // 相当于一个存放String类型的集合
    
    while(HeaderNamesList.hasMoreElements()){       // Enumeration获取键值的方法
        String headername = HeaderNamesList.nextElement();
        String headervalue = request.getHeader(headername);
        System.out.println(headername+":"+headervalue);
    }
    

    结果

    cache-control:no-cache
    postman-token:42a50d3d-827f-4b08-98da-e7cf1eee7c2a
    user-agent:PostmanRuntime/7.1.1
    accept:*/*
    host:127.0.0.1:8080
    accept-encoding:gzip, deflate
    connection:keep-alive

    refer头的作用

    可以知道请求的来源网站,用处是:可以做防止从其他网站点击a标签,访问我们的网站

    3、获取请求体(POST请求提交的参数)

    请求体格式:

    String username = request.getParameter("username");     // 获取单个表单值****
    System.out.println(username);   // 鑫哥
    
    String[] valuelist = request.getParameterValues("hobby");   // 获取一个数组***
    System.out.println(Arrays.toString(valuelist));     // [篮球, 足球]
    
    Enumeration<String> keylist = request.getParameterNames();  // 获取所有键的值,返回Enumeration集合
    while (keylist.hasMoreElements()){
        String k = keylist.nextElement();
        System.out.println(k+":"+Arrays.toString(request.getParameterValues(k)));
        /*
        username:[鑫哥]
        hobby:[篮球, 足球]
        sex:[男]
         */
    }
    
    Map<String,String[]> BodyMap = request.getParameterMap();  // 返回一个Map集合*****
    for(String key:BodyMap.keySet()){
        String[] values = BodyMap.get(key);
        System.out.println(key+":"+Arrays.toString(values));
        /*
        username:[鑫哥]
        hobby:[篮球, 足球]
        sex:[男]
         */
    }
    

    4、请求转发与request域

    Servlet1.java

    request.setAttribute("name","tom");     //向request域中存储数据
    
    RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");  //servlet1 将请求转发给servlet2
    dispatcher.forward(request,response);   //执行转发的方法
    

    Servlet2.java

    Object name = request.getAttribute("name");     // 取出域数据
    
    response.getWriter().write((String) name);  // 因为request域中的数据类型不一样,所以默认是Object属性,需要强转

    ServletContext域和Request域的声明周期

    ServletContext域

    • 创建:Web服务器启动
    • 销毁:Web服务器关闭
    • 域的作用范围:整个Web应用

    Request域

    • 创建:请求来时,创建Request对象
    • 销毁:响应结束
    • 域的作用范围:一次请求中

    转发与重定向的区别

    • 重定向两次请求,转发一次请求
    • 重定向地址栏的地址变化,转发地址不变
    • 重新定向可以访问外部网站 转发只能访问内部资源
    • 转发的性能要优于重定向

    客户端地址与服务器端地址的写法

    客户端地址:

    是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名称(直接输入地址与重定向)

    服务器端地址:

    服务器内部资源的跳转的地址,特点:不需要写web应用的名称(转发)

    示例:注册页面

    注意点:

    1)设置Post请求的编码

    request.setCharacterEncoding("UTF-8");  //设置request的编码---只适合post方式

    2)获取Map数据,将其装进JavaBean中

    // 获取请求体的数据
    Map<String,String[]> properties = request.getParameterMap();
    
    // 实例化javabean对象
    User user = new User();
    
    //使用BeanUtils进行自动映射封装
    //BeanUtils工作原理:将map中的数据 根据key与实体的属性的对应关系封装
    //只要key的名字与实体的属性 的名字一样 就自动封装到实体中
    try {
        BeanUtils.populate(user, properties);
    } catch (IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }
    
    System.out.println(user);   // {...}
    

    全部代码

    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.sql.SQLException;
    import java.util.Map;
    import java.util.UUID;
    
    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 org.apache.commons.dbutils.QueryRunner;
    
    import com.ithiema.utils.DataSourceUtils;
    
    public class RegisterServlet extends HttpServlet {
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//设置request的编码---只适合post方式
    		request.setCharacterEncoding("UTF-8");
    		
    		//get方式乱码解决
    		//String username = request.getParameter("username");//乱码
    		//先用iso8859-1编码 在使用utf-8解码
    		//username = new String(username.getBytes("iso8859-1"),"UTF-8");
    		
    		
    		//1、获取数据
    		//String username = request.getParameter("username");
    		//System.out.println(username);
    		//String password = request.getParameter("password");
    		//.....
    
    		//2、将散装的封装到javaBean
    		//User user = new User();
    		//user.setUsername(username);
    		//user.setPassword(password);
    
    		//使用BeanUtils进行自动映射封装
    		//BeanUtils工作原理:将map中的数据 根据key与实体的属性的对应关系封装
    		//只要key的名字与实体的属性 的名字一样 就自动封装到实体中
    		Map<String, String[]> properties = request.getParameterMap();
    		User user = new User();
    		try {
    			BeanUtils.populate(user, properties);
    		} catch (IllegalAccessException | InvocationTargetException e) {
    			e.printStackTrace();
    		}
    
    		//现在这个位置 user对象已经封装好了
    		//手动封装uid----uuid---随机不重复的字符串32位--java代码生成后是36位
    		user.setUid(UUID.randomUUID().toString());
    
    		//3、将参数传递给一个业务操作方法
    		try {
    			regist(user);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		//4、认为注册成功跳转到登录页面
    		response.sendRedirect(request.getContextPath()+"/login.jsp");
    		
    
    	}
    
    	//注册的方法
    	public void regist(User user) throws SQLException{
    		//操作数据库
    		QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
    		String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
    		
    		runner.update(sql,user.getUid(),user.getUsername(),user.getPassword(),user.getName(),
    				user.getEmail(),null,user.getBirthday(),user.getSex(),null,null);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    
    
    }
    
  • 相关阅读:
    Android不规则瀑布流照片墙的实现+LruCache算法
    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度
    Oracle backgroup processes
    Android中数据库的操作流程详解
    Dreamweaver PHP代码护眼配色方案
    Twitter 新一代流处理利器——Heron 论文笔记之Heron架构
    Docker简单介绍
    C#下使用GDAL
    Android:实现仿 美团/淘宝 多级分类菜单效果
    KVC在定义Model类中的妙用
  • 原文地址:https://www.cnblogs.com/x54256/p/8449902.html
Copyright © 2020-2023  润新知