JavaWeb(一)Servlet技术


Servlet

  • 一、Servlet
  • 1.理解Servlet
  • 2.Servlet生命周期、配置及使用
  • 3.Servlet继承图
  • 4.ServletConfig类
  • 5.ServletContext类
  • 6.HttpServletRequest类
  • (1)请求转发
  • (2)base标签
  • (3)请求重定向
  • 7.HttpServletResponse类
  • (1)输出流
  • (2)JavaEE三层架构
  • 二、HTTP协议
  • 1.GET请求
  • 2.POST请求
  • 3.响应
  • 4.MIME类型
  • 三、Junit使用




提示:以下是本篇文章正文内容,下面案例可供参考

一、Servlet

1.理解Servlet

运行在Java服务器的,用来处理request与response的小程序

2.Servlet生命周期、配置及使用

生命周期:

public class Servlet01 implements Servlet {//实际创建时,继承HttpSetvlet
	
    //    创建Servlet对象实例
    public Servlet01() {
        System.out.println("1 构造器方法");
    }
    //服务器开启后第一次初始化访问时执行
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 ini初始化方法");
    }
    //每次访问都会执行
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service方法,每次访问都会执行");
    }
    //服务器停止,Servlet销毁时执行
    public void destroy() {
        System.out.println("退出销毁时执行");
    }



    //获取Servlet配置
    public ServletConfig getServletConfig() { return null; }
    public String getServletInfo() { return null; }
}

配置:

<servlet>
        <!--定义一个Servlet-->
        <servlet-name>Servlet01</servlet-name>  <!--Servlet程序别名-->
        <servlet-class>chong.Servlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--给Servlet配置一个访问地址-->
        <servlet-name>Servlet01</servlet-name>
        <url-pattern>/servlet01</url-pattern>
    </servlet-mapping>

3.Servlet继承图

javassis javassist.tools.web.webserver_java

4.ServletConfig类

作用:
1.获取Servlet程序的别名 servlet-name的值
2.获取初始化参数 init-param
3.获取ServletContext对象

Servlet配置:

<servlet>
        <!--定义一个Servlet-->
        <servlet-name>Servlet01</servlet-name>  <!--Servlet程序别名-->
        <servlet-class>chong.Servlet01</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

Servlet常用方法:

public void init(ServletConfig servletConfig) throws ServletException {
//        1.获取Servlet程序的别名 servlet-name的值
        System.out.println("Servlet01的别名为: " + servletConfig.getServletName());
//        2.获取初始化参数 init-param
        System.out.println("初始化参数username的值为:" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数password的值为:" + servletConfig.getInitParameter("password"));

//        3.获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
    }

提示:当继承HttpServlet类后,再重写init方法时,需要调用super(config)方法,不然子类无法获得ServletConfig对象

public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
   public ServletConfig getServletConfig() {
        return this.config;
    }

5.ServletContext类

ServletContext是一个接口,一个工程只有一个ServletContext对象实例,他表示Servlet上下文的域对象(能存取数据的对象),在工程部署时创建
域对象方法	setAttribute()		getAttribute()		removeAttribute()
作用:
	1.获取web.xml中配置的上下文参数context-param
	2.获取当前的工程路径,	格式:/工程路径
	3.获取工程部署在服务器上的绝对路径
	4.可存取数据

实例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext sc = getServletContext();
//        1.获取web.xml中配置的上下文参数context-param
        System.out.println("context-param参数的值为:" + getServletContext().getInitParameter("name"));
//        2.获取当前的工程路径,	格式:/工程路径
        System.out.println("当前工程路径:" + sc.getContextPath());
//        3.获取工程部署在服务器上的绝对路径
        System.out.println("工程绝对路径:" + sc.getRealPath("/"));
        System.out.println("工程绝对路径:" + sc.getRealPath("/public/01.jpg"));

        //      "/" 被服务器解析为 http://ip:port/工程名/   映射到IDEA中的web目录
        //		"/"被浏览器解析为  http://ip:port/
//        4.可存取数据
        sc.setAttribute("key1","value1");
        System.out.println("获得的值:" + sc.getAttribute("key1"));
        sc.removeAttribute("key1");
        System.out.println("获得的值:" + sc.getAttribute("key1"));
 }

6.HttpServletRequest类

注意:在获取post请求中文参数时默认会乱码, 解决方式:获取请求所有参数之前request.setCharacterEncoding(“utf-8”);

将每一次的请求信息解析封装到Requst对象中,并传给service方法的(doGet和doPost)中

javassis javassist.tools.web.webserver_System_02

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("URI===>>" + request.getRequestURI());       //获取资源路径    /webtest/servlet02Auto
        System.out.println("URL===>>" + request.getRequestURL());       //获取请求的统一资源定位符(绝对路径)        http://localhost:8080/webtest/servlet02Auto
        System.out.println("客户端 ip地址===>>" + request.getRemoteHost());      //获取客户端IP地址     0:0:0:0:0:0:0:1 IPv6
        System.out.println("请求头User-Agent ===>>" + request.getHeader("User-Agent"));     //代理(浏览器)       Mozilla/5.0
        System.out.println("请求方式 ===>>" + request.getMethod());    //请求方式   GET
        //获取参数
        System.out.println("姓名:" + request.getParameter("username"));
        System.out.println("兴趣爱好:"  + Arrays.asList(request.getParameterValues("hobby")));      //复选框获取多个值
    }

(1)请求转发

只是一次请求,共享请求域中的数据,可以转发到WEBz-INF目录下,不能转发到外部资源

图示理解:

javassis javassist.tools.web.webserver_java_03


代码:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getParameter("username"));
        req.setAttribute("key1","value1");
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet01");  // 获取调度对象
        requestDispatcher.forward(req,resp);        //(携带请求与响应对象)进入调度地址
    }

(2)base标签

当没有base标签时,本页的相对路径参照浏览器地址栏中的地址
base标签,改变本页相对路径参考的路径
<base href="http://localhost:8080/WebTestA" />

(3)请求重定向

两次请求,不共享请求对象域资源。

图示理解:

javassis javassist.tools.web.webserver_java_04


代码实现:

//法一:

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("曾到此一游!Servlet01");
        //设置响应状态码,表示重定向
        resp.setStatus(302);
        //设置重定向的地址
        resp.setHeader("Location","http://localhost:8080/webtest/servlet02Auto");
//法二(推荐):
		resp.sendRedirect("http://www.baidu.com");
	 }

7.HttpServletResponse类

通过HttpServletResponse对象来设置响应信息

(1)输出流

字节流		getOutputStream();					常用于下载(传递二进制文件)
字符流		getWriter();						常用于回传字符串(常用)
使用时,只能选择一个
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 //解决中文乱码:
//		法一:
//        System.out.println(resp.getCharacterEncoding());     //ISO-8859-1
//        resp.setCharacterEncoding("UTF-8");     //设置服务器响应使用的字符集
//
//        //将响应的内容信息(包括字符集信息)放入响应头中告诉浏览,然后浏览器按对应的字符集解析该字符串
//        resp.setHeader("Content-Type","text/html;charset=UTF-8");
//		法二:
        resp.setContentType("text/html;charset=UTF-8");     //在获取流对象之前才有效
        System.out.println(resp.getCharacterEncoding());     //ISO-8859-1


        PrintWriter writer = resp.getWriter();
        writer.write("江江最帅 content!!!");
    }

(2)JavaEE三层架构

图示理解:

javassis javassist.tools.web.webserver_javassis_05

二、HTTP协议

常见响应码:200 302(重定向) 404 500

1.GET请求

格式:
1.请求行
	(1)	请求方式							GET
	(2)	请求资源路径[+?+请求参数]
	(3)	请求协议域版本号			HTTP/1.1
2.请求头
	key:value

图示:

javassis javassist.tools.web.webserver_java_06

2.POST请求

格式:
1.请求行
	(1)	请求方式							GET
	(2)	请求资源路径[+?+请求参数]
	(3)	请求协议域版本号			HTTP/1.1
2.请求头
	key:value
空行
3.请求体    ===>> 发送给服务器的数据

图示:

javassis javassist.tools.web.webserver_System_07

3.响应

格式:
1.响应行
	(1)响应的协议域版本号
	(2)响应状态码
	(3)响应状态描述符
2.响应头
	(1) key: value
空行
3.响应体				===>>回传给客户端的响应数据

图示:

javassis javassist.tools.web.webserver_System_08

4.MIME类型

Multipurpose Internet Mail Extensions    	多功能internet邮件扩充服务		格式:”大类型/小类型“,与某种文件名相对应

MIME常见格式:

javassis javassist.tools.web.webserver_javassis_09

三、Junit使用

步骤
	1.定义测试类(被测类类名加Test)
	2.定义测试方法		建议:
	 	参数:空参		方法名:test被测方法名	  	返回值:void
	3.给方法加@Test
	4.导入junit依赖环境

使用实例:

//被测类
	public class Methods {
    public static int add(int a, int b){
        return a + b;
    }
    public static int sub(int a, int b){
        return Math.abs(a - b);
    }
}

//Junit使用			Assert.assertEquals  使用“断言”测试结果
public class MethodsTest {
    /**
     * 初始化方法:
     * 用于申请资源,所有测试方法执行之前都会执行该方法
     */
    @Before
    public void init(){
        System.out.println("init ...");
    }

    /**
     * 释放资源方法:
     * 用于释放资源,所有测试方法执行之后都会执行该方法
     */
    @After
    public void close(){
        System.out.println("close ...");
    }


    /**
     * 测试
     */
    @Test
    public void testAdd(){
        int result = Methods.add(1,3);
        System.out.println("test");
        Assert.assertEquals(4,result);  //期望结果,运算结果			
    }
}