自动化测试(java+servlet)四

•Servlet

是Java Servlet的简称,是小服务程序或服务连接器,是用Java编写的服务器端
程序,主要功能在于获取请求,返回响应。
•广义:一个Servlet是一个Java语言编写的类,提供请求响应式的编程模型。
•狭义:Servlet是指Java语言实现的一个接口

简单说就是封装了现成函数的api和接口。继承HttpServlet就会变成一个servlet。这里面最常用的是get请求和post请求

public class web_selenium extends HttpServlet {
    //重写doget dopost,就可以在这个类中实现get、post方法
    //req这个参数可以获得浏览器请求时传来的数据 resp可以给浏览器响应一些数据
    protected  void doGet(HttpServletRequest req,HttpServletResponse resp){
        //super.doGet(req,resp);这行是调用父类的方法,可以选择自己写
        //给浏览器响应一些内容
        PrintWriter writer = resp.getWriter();
        writer.println("hello,this is demoservlet");
        //if you want to scan this method, you need to give it a path路径.在xml中配置
        
    }
    protected  void doPost(HttpServletRequest req,HttpServletResponse resp){
        super.doPost(req,resp);
    }
}

解决乱码问题:

@override
protected void doGet(HttpServletRequst request,HttpServletResponse response)
    throws IOException{
    //解决中文乱码
    request.setCharacterEncoding("UTF-8");
    //处理需求
    String account = request.getParameter("account");
    //响应给客户端
    response.setContentType("text/html;charset=utf-8");
    printWriter writer = response.getWriter();
    String html = "<h1 style = \"color:#000;\">"+account+"</h1>";
    writer.print(html);
    }
@override
protected void doPost(HttpServletRequst request,HttpServletResponse response)
    throws IOException{
    
    doGet(requst,response);//get post的区别在于,get会把相关信息显示在网址框,而post不会,适合使用密码登录等隐私场景。
    }

 在web.app中对get、post进行编码

<html lang="en">
<head>
    <meta charset="UT-8">
    <title>Title</title>
</head>
<body>
    <form method="get"action="demo">
    get请求:
    <input type="text"name="account"/>
    <input type="submit"value="搜索"/>
</form>

    <form method-"post" action="demo">
    post请求:
    <input type="text" name="account"/>
    <input type="submit"value="登录"/>
</form>
</body>
</html>

•1. 编写Servlet程序(实现Servlet接口)

•2. 编译Servlet源文件,生成字节码文件
•注意:
①DOS窗口中进入Servlet文件所在目录
②-cp参数 导入需要的jar包
javac -cp ./lib/* Hello.java

3. 部署
–在Tomcat的webapps目录下创建项目目录
–在项目目录下创建WEB-INF目录
–在WEB-INF目录下放置web.xml
配置文件、classes目录和lib目录
–classes目录中是步骤2中
生成的字节码文件
–lib目录中是用到的jar

 4. 运行
–启动Tomcat
–访问Servlet

URL到Servlet的映射

•<url-pattern>标签的匹配方式
–“完整URL”:如“/HelloServlet”
–“/目录/*”方式:以“/目录”做为开头的URL
–“*.do”:以.do结尾的地址

Sevlet---请求转发与重定向的不同

1、请求转发是同一服务器中的资源,重定向可以使用任一服务器内的资源。

2、在请求次数上不同,请求转发需要一次请求,重定向是两次请求

3、请求转发URL地址栏不变,重定向URL地址栏发生改变

4、请求转发中两个servlet实例共用请求响应对象,重定向才需要创建两次请求与响应对象。

servlet的运行依赖于tomcat容器

共享变量

servlet类是httpserlet的子类,可以声明一个成员变量

当用户请求加载servlet请求时,服务器会为每个用户都加载出一个线程

该线程线程中servlet调用servise方法,来响应用户的请求。

其中,servlet的成员变量是被所有线程共享的

servlet生命周期

1、init 初始化方法,在servlet被创建时执行,只执行一次,作一些初始化的工作

通过config. getInitParameter(Param)可取得web.xml中的参数

public void init(ServletConfig servletConfig)throws ServletException{
}

2\ 、service提供服务方法,每一servlet被访问时,执行。

3、destroy销毁方法,在servlet服务器正常关闭时,只执行一次

4、getServletConfig() 返回一个ServletConfig对象,作为一个Servlet的开发者,应该通过ini方法存储对象以便这个方法能返回这个对象。

5、getServletInfo() 允许Servlet向主机的Servlet运行者提供有关信息。返回的字符串应该是纯文本格式而不是任何标志(HTML、XML)

•Servlet的生命周期可以分为四个阶段
–加载和实例化:由Servlet容器完成
–初始化:实例化Servlet后会调用init方法
–处理客户请求:service方法(doGet或doPost)
–销毁:销毁之前会调用destroy方法

HTTP

超文本传输协议

特点:

1、基于TCP/ip的高级协议

2、默认端口号:80

3、基于请求、响应模型的一次请求对应一次响应

4、无状态的,每次请求之间相互独立,不能交互数据

Servlet应用开发接口

HttpServlet抽象类

•基于HTTP协议的Servlet
•继承自GenericServlet
•一般重写doXXX()方法处理业务逻辑/返回响应
•扩展
–protected void service( HttpServletRequest Req, HttpServletResponse Resp) 
–public void service( ServletRequest Req, ServletResponse Resp)

Servlet什么时候实例化

•在服务器启动加载网站时
•第一次访问Servlet时
•通过web.xml配置文件中对应Servlet设置项的<load-on-startup>节点设置加载时机
–标记容器是否在启动的时候就加载这个servlet
–当值为0或者大于0时,表示容器在应用启动时就加载这个servlet
–当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载

ServletConfig接口

•ServletConfig包含Web程序部署描述符(web.xml)中定义的参数,封装了能返回xml信息的函数
•ServletConfig是由Servlet容器实例化
–Servlet实例化的同时实例化对应的ServletConfig对象,并传入到init(ServletConfig config)

1、ServletConfig 获取到servlet的别名,使用getServletName()方法

也就是获取的第一行内容<servlet-name>

String servletName = config.getServletName();
System.out.println(servletName);

2、获取servlet初始化参数

String username = config.getInitParamenter("username");
System.out .println("初始化参数=="+username);

3、获取servletContext对象,可以获取当前web的上下文

ServletContext context = config.getServletContext();
System.out.println(context);

ServletContext接口

•每个Web应用启动后,Servlet容器都会创建唯一的一个ServletContext对象,该对象包含整个Web程序的信息
•在自己定义的Servlet中,可以通过getServletContext()方法获得ServletContext对象
–getServletContext()是在GenericServlet类中定义的

数据共享
 

 同一个Servlet对象,通过ServletConfig对象共享数据
–初始化参数在web.xml文件中给出
 在整个Web应用范围内,通过ServletContext 的set/getAttribute方法共享数据
–初始化参数在web.xml文件中给出

•1. set/getAttribute(),应用于request与request之间(请求转发)
•2. getParameter(),应用于客户端页面与Servlet之间(参数来自于Html、JSP)
•3. getServletConfig(). getInitParameter( “param”),应用于同一个Servlet对象
•4. getServletContext(). getInitParamete“param”),应用于整个Web应用范围

Servlet非线程安全

Servlet是多线程应用
–Servlet容器通常只创建一个Servlet实例,不同的请求都分配一个线程来进行处理,但它们操作的都是同一个Servlet实例,所以可使用Servlet的成员变量共享数据,所以也产生了线程安全的问题

Servlet进阶

•ContentType属性,输出非文本数据
–如:response.setContentType("image/jpg");
–示例:项目001的ImageServlet
•编码问题
–request.set/getCharacterEncoding
–response.set/getCharacterEncoding
•示例: 001的CharacterServlet

web.xml与@WebServlet注解

标注、解释。先打上标记再解释处理。可用在类、属性、方法、参数上。底层可以识别注解,但不会影响代码逻辑

@override 检查该方法是否正确复写

@WebServlet(name=“/demo”,urlPatterns="/demo")。可以实现web.xml配置文件的功能


 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Junit单元测试是一种用于测试Java代码的框架,可以对代码进行自动化的单元测试。ServletJava Web应用程序中的一个基础组件,用于处理用户请求和生成响应。 在编写Junit单元测试Servlet案例时,我们需要按照以下步骤进行: 1. 导入必要的依赖库:包括Junit框架以及Servlet相关的库。 2. 创建一个测试类:在该类中,我们需要创建一个Servlet实例,用于测试。 3. 编写测试方法:在测试方法中,我们可以通过模拟用户请求和验证Servlet的响应来测试代码的逻辑和正确性。这包括设置请求的参数、调用Servlet的service()方法,并通过断言来验证结果是否符合预期。 4. 运行测试:通过运行测试类,我们可以执行所有的测试方法,并获取测试结果。Junit会自动记录通过和失败的测试用例。 5. 分析测试结果:根据测试结果,我们可以检查代码逻辑是否正确,以及是否满足预期要求。如果有失败的测试用例,我们可以通过查看日志和调试代码来找出问题。 总结来说,Junit单元测试可以帮助我们验证Servlet的功能和正确性,减少潜在的错误和问题。通过编写完善的单元测试,我们可以在开发和维护过程中更加自信地进行代码重构和修改。 ### 回答2: JUnit单元测试是一种常用的软件测试方法,用于验证代码的各个部分是否正常工作。在Servlet案例中,JUnit单元测试可用于验证Servlet的各个方法是否按照预期进行处理。 对于Servlet案例,可以创建一个针对Servlet类的测试类。在测试类中,可以使用JUnit的`@Test`注解来标记各个测试方法。例如,可以编写以下代码: ```java import org.junit.Test; import org.junit.Assert; import org.mockito.Mockito; public class ServletTest { @Test public void testDoGet() throws IOException, ServletException { HttpServletRequest request = Mockito.mock(HttpServletRequest.class); HttpServletResponse response = Mockito.mock(HttpServletResponse.class); Servlet servlet = new Servlet(); // 模拟请求参数 Mockito.when(request.getParameter("name")).thenReturn("John"); // 调用Servlet的doGet方法 servlet.doGet(request, response); // 验证响应是否符合预期 Mockito.verify(response).setContentType("text/plain"); Mockito.verify(response).getWriter().write("Hello, John!"); } @Test public void testDoPost() throws IOException, ServletException { HttpServletRequest request = Mockito.mock(HttpServletRequest.class); HttpServletResponse response = Mockito.mock(HttpServletResponse.class); Servlet servlet = new Servlet(); // 模拟请求参数 Mockito.when(request.getParameter("age")).thenReturn("25"); // 调用Servlet的doPost方法 servlet.doPost(request, response); // 验证响应是否符合预期 Mockito.verify(response).setContentType("text/plain"); Mockito.verify(response).getWriter().write("Your age is 25."); } } ``` 在上述代码中,我们创建了`HttpServletRequest`和`HttpServletResponse`的模拟对象,并使用`Mockito`框架模拟了这两个对象的行为。然后,我们创建了一个要测试的`Servlet`对象,并调用其`doGet`和`doPost`方法。 在`doGet`和`doPost`方法的测试中,我们使用`Mockito.when`方法来模拟请求参数的值,并使用`Mockito.verify`方法来验证响应是否符合预期。 通过编写这些JUnit单元测试,我们可以确保Servlet的各个方法在各种情况下都能正常工作,并且能够正确地处理请求和生成响应。这样可以提高代码的可靠性和质量,减少代码改动时引入的潜在问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值