Servlet/HTTP/Request/BeanUtils工具类

Servlet

Servlet的结构体系

Servlet是一个接口;其中有两个子类抽象类实现了该接口分别是GenericServletHttpServlet

GenericServlet:将Servlet接口中的其他方法做了默认空实现;其中只将service()方法作为抽象
因此;将来定义Servlet类时可以继承GenericServlet;实现Service()方法即可

例如:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class servlet_demo1 extends GenericServlet {	//继承继承GenericServlet

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        
    }
}

HttpServlet:对http协议的一种封装;简化操作;比较常用
因此;Servlet类继承HttpSverlet;然后复写都doGet/doPost方法即可

例如:

@WebServlet("/demo3")
public class servlet_demo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}
Servlet相关配置

urlpartten:也就是Servlet访问路径;一个Servlet可以定义多个访问路径;例如下方

@WebServlet("/demo4")
//@WebServlet({"/d4","/dd4","demo4"}) //可以是数组
//@WebServlet("/user/demo4")  //多层路径
//@WebServlet("/*")  //通配符;优先级最低
//@WebServlet("*.action")  //扩展名匹配

HTTP

概念

HTTP指的超文本传输协议(Hyper Text Transfer Protocol);定义了客户端和服务器端通信时发送数据的格式

特点:基于TCP/IP的高级协议;默认端口80;一次请求对应一次响应;每次请求之间相互独立

历史版本:1.0/每一次请求都会建立新的连接;1.1/复用连接

请求消息数据格式

请求行

请求行其实就是地址栏;请求方式有7种其中比较常用的就是get和post

  • GET:请求参数请求行中在url后;请求的url长度有限制的;不太安全
    在这里插入图片描述

  • POST:请求参数在请求体中;请求的url长度没有限制的;相对安全
    在这里插入图片描述

请求头

客户端浏览器告诉浏览器一些信息

常见的请求头:

  • User-Agent/浏览器告诉服务器我反问你实用的浏览器版本信息
    在这里插入图片描述
  • Referer/告诉浏览器我从哪里来的;作用就是用于防盗链和统计工作
    在这里插入图片描述

请求空行

用于分割POST请求的请求头和请求体

请求体

封装POST请求信息的请求参数

  • 例如
    在这里插入图片描述

Request

request对象和response对象的原理
  • request和respon对象是由服务器创建的;我们来使用它们
  • request独享是来获取请求请求信息的;response对象是来设置相应信息的
request对象继承体系结构

SerletRequest(接口)>HttpServletRequest(接口) /它们之间是继承关系

request对象功能

获取请求行数据

方法名说明
String getMethod()获取请求方式
String getContextPath()获取虚拟目录
String getServletPath()获取Servlet路径
String getQueryString()获取get方式请求参数
String getRequestURI()获取请求统一资源标识符(eg:共和国)
StringBuffer getRequestURL()获取请求统一资源定位符(eg:中华人民共和国)
String getProtocol()获取协议及版本
String getRemoteAddr()获取客户机的IP地址

获取请求头数据

方法名说明
String getHeader(String name)通过请求头的名称获取相对的值
Enumeration getHeaderNames()获取所有的请求头名称

获取请求体数据

要注意的是只有POST方式才有请求体;在请求体中封装了POST请求的请求参数

其他功能

获取请求数据通用方式

不论是get还是post请求方式都可以使用下列方法来获取请求参数

方法名说明
String getParameter(String name)根据参数名称获取参数值
String[] getParameterValues(String name)根据参数名称获取参数值的数组(eg:复选框)
Enumeration getParameterNames()获取所有参数的参数名称
Map<String,String[]> getParameterMap()获取所有参数的map集合

中文乱码问题:
由于tomcat8已经将get方式乱码问题解决了;但是post方式还是会乱码;所以解决办法就是在获取参数前设置request的编码

request.setCharacterEncoding("utf-8");

综合例子:

import ...

@WebServlet("/demo5")
public class servlet_demo5 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	req.setCharacterEncoding("utf-8");  //中文乱码问题;只有post会出现
    	
        String username = req.getParameter("username"); //根据名称获取值
        System.out.println(username);

        String[] hobbies = req.getParameterValues("hobby");
        for (String s :			//对数组进行遍历
                hobbies) {
            System.out.println(s);
        }

        Enumeration<String> parameterNames = req.getParameterNames();	//获取所有请求参数名称
        while (parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println(s);
            String value = req.getParameter(s);	//然后根据名称获取值
            System.out.println(value);
            System.out.println("-----");
        }
        
        Map<String, String[]> parameterMap = req.getParameterMap();	//获取所有参数的map集合
        Set<String> strings = parameterMap.keySet();	//获取所有的键
        for (String name :
                strings) {
            System.out.println(name);
            String[] values = parameterMap.get(name);	//通过键的名称获取值
            for (String value :
                    values) {
                System.out.println(value);
            }
            System.out.println("---");
        }      
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp); //由于是通用方式所以执行方法可以一样
    }
}

请求转发

请求转发是一种服务器内部的资源跳转方式;如何实现:

  • 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  • 然后使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

例子://".demo4为转发路径;req和resp为当前的request对象和response对象"

	req.getRequestDispatcher("/demo4").forward(req,resp);   //请求转发

特点:浏览器地址栏路径不发生变化;只能转发到当前服务器内部资源中;转发是一次请求

共享数据

域对象:一个有范围的对象;可以在范围内共享数据

方法名说明
void setAttribute(String name,Object obj)存储数据
Object getAttitude(String name)通过键获取值
void removeAttribute(String name)通过键移除键值对

BeanUtils工具类

BeanUtils类的目的就是简化数据封装;使用BeanUtils类要导入jar包 BeanUtils 提取码:hexh

用于封装JavaBean的;有以下要求:

  1. 类必须被public修饰
  2. 必须提供空参的构造构造方法
  3. 成员变量必须使用private修饰
  4. 提供公共setter和getter方法

其中用的最多的方法就是

方法名说明
populate(Object obj , Map map)将map集合的键值对信息,封装到对应的JavaBean对象中

至于为什么要引入这个工具类;看看以下的代码

现在将获取的的参数将它封装成一个对象;那么一旦参数有成千上百个的时候封装时的代码量是不是变得很多

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

如果用了BeanUtils类的话;只需要获取参数map集合然后创建对象;再然后通过populate()方法就可自动帮你封装对象

        Map<String, String[]> parameterMap = req.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user,parameterMap);	//注意第一个参数填对象;第二个参数填map集合
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

有了以上的知识;就可以编写一个用户登录的案例了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是Java程序在运行时找不到org/apache/commons/beanutils/beanutils类所导致的。可能是因为缺少相关的依赖库或者类路径设置不正确。需要检查程序的依赖关系和类路径设置,确保程序能够正确加载所需的类。 ### 回答2: java.lang.noclassdeffounderror: org/apache/commons/beanutils/beanutils 是一种常见的Java异常,它通常会出现在开发人员使用Java程序时发生错误的情况下。这个错误通常表示在运行Java程序时,编译器无法找到所需的类或库文件。 这个错误通常是由于以下原因之一导致的: 1. 缺少所需的Java库文件:有些Java程序需要特定的库文件才能正常运行。如果你的程序需要这些库文件,而你的系统上没有安装这些库文件,那么该错误就会出现。解决方法是安装所需的Java库文件。 2. 类路径问题:当你编写Java程序时,你需要指定类路径,以确保编译器能够找到所需的类文件。如果你的类路径配置不正确,那么编译器就找不到所需的类文件,从而导致该错误。解决方法是设置正确的类路径。 3. 版本不匹配:如果你使用的是旧版本的Java库文件,并且你的Java程序需要新版本的Java库文件,那么该错误就会出现。解决方法是更新Java库文件。 4. 编译器问题:有时,这个错误可能是由于编译器本身出现问题而导致的。在这种情况下,最好的解决方法是更新或更换编译器。 针对该错误,我们需要排除上述情况,找出具体原因,才能彻底解决问题。通常情况下,正确的Java类库文件可以从Maven服务器或其他Java库管理工具中获取。如果您的Java类库文件不存在于这些存储库中,那么您也可以下载它并手动将其添加到自己的项目中。同时,可以将所需的jar包通过软件打包到3rd-party librarys等文件夹下,然后在对应项目中添加该文件夹作为引用库,再运行项目即可。 ### 回答3: java.lang.noclassdeffounderror: org/apache/commons/beanutils/beanutils是一种Java程序开发过程中常见的错误。这通常表示Java虚拟机(JVM)在尝试加载与指定类相关的依赖项(JAR文件)时出现问题。 出现此错误的原因有多种,例如: 1. 缺少相关的依赖项或库。如果您的项目需要使用Apache Commons BeanUtils库,但您的项目配置不包括此依赖项或您的依赖项版本与项目不兼容,那么您可能会遇到此错误。 2. 您的类路径中没有包含所需的JAR文件或目录。请确保您的项目配置或运行时环境正确设置,并且所需的依赖项已正确添加到类路径中。 3. 其他相关问题。例如,您可能已经改变了您的项目依赖项或类路径设置,但您没有正确重新启动JVM。或者,您的项目可能与其他应用程序或库存在冲突,需要进一步排查。 解决该错误通常需要确定缺少哪些依赖项,并将其添加到项目中或安装到正确的位置。您可以通过查询相关的错误消息,查看日志或调试程序来诊断该问题。 一些实用的解决方法包括: 1. 确保您的项目配置正确,包括正确设置依赖项和类路径。 2. 检查您的项目依赖项是否最新,并在必要时更新它们。 3. 在恰当的位置,手动安装所需的JAR文件或目录。 4. 确认JVM已正确设置并按您的预期工作。 5. 如果您仍然无法解决问题,请参阅相关的文档和资料,寻求社区或专家的帮助。 总之,java.lang.noclassdeffounderror: org/apache/commons/beanutils/beanutils一般是由于环境配置不正确导致的错误,需要对项目的配置以及依赖项进行仔细的排查和处理,才能解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值