zl程序教程

您现在的位置是:首页 >  APP

当前栏目

学javaweb 先学Servlet 应用理论很重要

2023-03-14 09:45:01 时间
package cn.Reapsun.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {

    /**
     * request   -->封装了客户端所有请求数据
     * 请求行
     * 请求头
     * 空行
     * 请求体(GET没体)
     * 
     *     回忆http协议
     * 
     * 获取常用信息  
     * >获取客户端IP request.getRemoteAdder()
     * >请求方法   request.getMethod()  ,可能用POST  也可能GET
     * 
     * 获取HTTP请求头
     *  >*** String getHeader(String name) 适用单值头
     *  >int getIntHeader(String name)  使用单值int类型的请求头
     *  >long getDateHeader(String name)适用单值毫秒类型的请求头
     *  >Enumeration<String> getHeaders(String),适用于多值请求头
     *  
     *  案例
     *  >通过User-Agent识别用户浏览器类型
     *  >防盗链:如果请求不是通过本网站连接发布的,发送错误代码404 Referer这个请求头,表示请求的来源  
     *  
     *  获取请求URL
     *  >String getScheme()  获取协议
     *  >String getServletName()  获取服务器名称  http
     *  >String getServletPort()  获取服务器端口  8080
     *  >String getContextPath() 获取项目名称   /day10_2
     *  >String getServletPath() 获取Sercvlet()路径 /AServlet
     *  >String getQueryString() 获取参数部分,即问号即问好后面部分  username=xxx&password=yyy
     *  >String getRequestURI() 获取请求URI 等于项目名 + Servlet路径  /day_2/AServlet
     *  >String getRequestURL()  获取请求URL 等于不包含参数的整个请求路径  http://localhost:8080/day10_2/AServlet
     *  
     *  获取请求
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //演示获取客户端的IP地址、获取请求方式、获取User-Agent ,得到客户端信息(操作系统浏览器)  
        String adder = request.getRemoteAddr();//获取客户端IP
        System.out.println("IP :" + adder);
        System.out.println("请求方式 :" + request.getMethod());//获取请求方式
        String userAgent = request.getHeader("User-Agent");//获取名为User-Agent的请求头
        System.out.println(userAgent);
        //IP :0:0:0:0:0:0:0:1
        /*请求方式 :GET
        Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36*/
        
        //是否包含Chrome 如何过包含  说明用的是google浏览器
        if(userAgent.toLowerCase().contains("chorme")){
            System.out.println("你好:" + adder + "你用的是谷歌");
        }else if (userAgent.toLowerCase().contains("firefox")) {
            System.out.println("你好:" + adder + "你用的是火狐");
        }else if (userAgent.toLowerCase().contains("msie")) {
            System.out.println("你好:" + adder + "你用的是IE");
        }
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>AServlet</servlet-name>
    <servlet-class>cn.Reapsun.servlet.AServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CServle</servlet-name>
    <servlet-class>cn.Reapsun.servlet.CServle</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BServlet</servlet-name>
    <servlet-class>cn.Reapsun.servlet.BServlet</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>AServlet</servlet-name>
    <url-pattern>/AServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CServle</servlet-name>
    <url-pattern>/CServle</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BServlet</servlet-name>
    <url-pattern>/BServlet</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
package cn.Reapsun.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends HttpServlet {

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 使用Referer请求头反盗链
         */
        String referer = request.getHeader("Referer");
        System.out.println("referer");
        if (referer == null || !referer.contains("localhost")) {
            response.sendRedirect("http://www.baidu.com");
            
        } else{
            System.out.println("Hello!");
        }
    }    

}
<!DOCTYPE html>
<html>
  <head>
    <title>a.html</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>
    <a href="/day10_2/BServlet">xxx</a>
  </body>
</html>

 

演示request  获取请求参数 
package cn.Reapsun.Servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
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;

/*
 * 演示request  获取请求参数 
 *  *  获取请求URL
     *  >String getScheme()  获取协议
     *  >String getServletName()  获取服务器名称  http
     *  >String getServletPort()  获取服务器端口  8080
     *  >String getContextPath() 获取项目名称   /day10_2
     *  >String getServletPath() 获取Sercvlet()路径 /AServlet
     *  >String getQueryString() 获取参数部分,即问号即问好后面部分  username=xxx&password=yyy
     *  >String getRequestURI() 获取请求URI 等于项目名 + Servlet路径  /day_2/AServlet
     *  >String getRequestURL()  获取请求URL 等于不包含参数的整个请求路径  http://localhost:8080/day10_2/AServlet
     *  
     *  获取请求参数  请求参数是由客户端发送给服务器的!有可能在请求体中(POST)  也可能在URL之后(GET)
     *  请求参数:有一个参数一个值,还有一个参数多个值!
     *  >*******************String getParameter(String name) : 获取指定请求参数值  适用单值请求参数
     *  >String[] getParameterValues(String name)  获取指定请求参数值  适用多值请求参数
     *  >Enumeration<String ,String[]> getParameterMap() :获取所有请求参数,其中key为参数名  value为参数值
     *  案例  超链接参数
     *  案例 表单数据
     */
public class AServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("GET: " + request.getParameter("xxx"));
        System.out.println("GET: " + request.getParameter("yyy"));
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobby = request.getParameterValues("hobby");
        
        System.out.println(username + password + Arrays.toString(hobby));
        
        /*
         * 获取所有请求参数名称
         */
        Enumeration names = request.getParameterNames();
        while(names.hasMoreElements()){
            System.out.println(names.nextElement());
        }
        
        /*
         * 获取所有请求参数,封装到map中
         */
        Map<String,String[]> map = request.getParameterMap();
        //System.out.println(map);
        for (String name : map.keySet()) {
            String[] values = map.get(name);
            System.out.println("name: " + "=" + Arrays.toString(values));
        }
    }

}

 

package cn.Reapsun.Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends HttpServlet {

    /**
     * 简单说下  请求转发 和请求包含
     * RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
     * 请求转发  rd.forward(request,response);   使用request获取ResquestDispatcher对象  方法参数 是被转发或包含的Servlet的servlet路径
     * 请求包含  rd.include(request,response);
     * 
     * 有时需要请求多个Servlet协作才能完成所以需要在一个Servlet跳转到另外一个Servlet!
     * >一个请求跨越多个Servlet   需要使用转发和包含
     * >请求转发  由下一个Servlet完成响应体  当前Servlet可以设置响应头(留头不留体)  
     * >请求包含  由两个Servlet完成响应体(都留)
     * >无论是请求头转发还是请求包含  都在一个请求范围内  使用一个Request  和response
     * 
     * request域
     *      void setAttribute(String name,Object value)
     *      Object getAttribute(String name)
     *  >同一请求 范围内使用 request.setAttribute()  resquest.getAttribute() 来宣传! 前一个Servlet 调用setAttribute()保存值  后一个Servlet调用getAttribute() 保存值,后一个Servlet调用getAttribute()获取值
     *  
     *  >请求转发和重定向区别
     *  >请求转发是一个请求一次响应  而重定向是两次请求两次响应
     *  >请求转发地址栏不变  而重定向会显示后一个请求地址
     *  >请求抓转发只能转发到本项目其他Servlet 而重定向不只能重定向到本项目的其他Servlet  还能定向到其他项目
     *  >请求转发是服务器端行为 只需给出转发的Servlet路径  而重定向需要给出requestURL 即包含其他项目名
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


    }

}

 

第一,servlet可以让你比较彻底的了解一下java web应用的流程,这对你以后学习一些web方面开源的框架有好处,
第二,你如果先不学习servlet的话很多异常你是无从下手调试的,因为初学java web应用有很多异常是由于粗心导致的,
第三,JSP它本质上来说是servlet和html的混合体,JSP在执行的时候会被先解释为servlet源程序的,换句话说他必须以servlet作为基础,如果不先学习servlet的话,对JSP你是很难透彻的理解他的,我认为要学好JAVA WEB应用理论是很重要的。
 
JSP 在大型 外网 Java Web 项目中被淘汰掉,可没说 JSP 可以完全不学,对于一些人来说,Servlet 等相关的 Java Web 基础还是要掌握牢的,不然Spring MVC 这种框架是基于什么你都不知道