IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Servlet-请求与响应 -> 正文阅读

[系统运维]Servlet-请求与响应

一、JSP校验

一般我们在提交表单的时候会在前端进行信息校验,但有些用户会故意直接访问校验的那个jsp,如果这样的次数多了,服务器不停调用数据库无疑会大大增加服务器的负担,所以我们可以在服务器端增加一个校验。
前端

<form action="DoLogin">
    <p>账号:<input type="text" name="user"><span class="span_user"></span> </p>
    <p>密码:<input type="password" name="pwd"><span class="span_pwd"></span></p>
    <input type="submit"/>
</form>
<script type="text/javascript">
    $(()=>{
        $("input[name='user']").blur(function (){
            console.log($(this).val())
            if($(this).prop("value") == "") {
                console.log(111)
                $(".span_user").text("用户名不能为空").css("color", "red").addClass("error")
            }else{
                $(".span_user").text("√").css("color", "green").removeClass("error")
            }
        })
        $("input[name='pwd']").blur(function (){
            if($("input[name='pwd']") == ""){
                $(".span_pwd").text("密码不能为空").css("color", "red").addClass("error")
            }else{
                $(".span_pwd").text("√").css("color", "green").removeClass("error")
            }
        })
        $("form").submit(function (){
            var error = $(".error")
            $("input[name='user']").trigger("blur")
            $("input[name='pwd']").trigger("blur")
            if(error.length != 0){
                return false
            }else{
                return true
            }
        })
        <%
        String msg = (String) request.getAttribute("msg");
        if(msg !=null && !msg.equals("")){
            out.print("alert('"+msg+"')");
        }
        %>
    })
</script>

后端

@WebServlet(urlPatterns = "/DoLogin")
public class DoLogin extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        if(user== null ||user.equals("")){
            req.getRequestDispatcher("protected.jsp").forward(req,resp);
            return ;
        }
        if(user.equals("admin") && pwd.equals("123456")){

            req.getRequestDispatcher("index.jsp").forward(req,resp);
        }else{
            req.setAttribute("msg","账号或密码不正确");
            req.getRequestDispatcher("Login.jsp").forward(req,resp);
        }
    }
}

二、路径问题

  • 绝对路径
    • 绝对路径是包含协议、地址、端口号以及需要访问的详细地址,它的范围最广,可以访问不同服务器的项目
     <a href="http://127.0.0.1:8080/servlet02/path1/update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a> <br/>
         <a href="http://127.0.0.1:8080/servlet02/path1/subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a> <br/>
         <a href="http://127.0.0.1:8080/servlet02/path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a> <br/>
         <a href="http://127.0.0.1:8080/servlet02/index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
         <a href="http://127.0.0.1:8080/servlet02/servlet/DoLogin2">访问servlet的路径</a> <br/>
         <a href="http://127.0.0.1:8080/servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a> <br/>
         <a href="http://192.168.153.63:9527/jsp/time.jsp">同一个局域网中不同服务器中的项目</a> <br/>
    
  • 相对路径A(跟路径)
    <h3>根路径(用"/"开始后面紧跟项目的名称+需要访问的路径){范围:同一个服务器中所有的项目} "/":当前的服务器    "/"=E:\apache-tomcat-7.0.79\webapps </h3>
    <a href="/servlet02/path1/update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a>
    <a href="/servlet02/path1/subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a>
    <a href="/servlet02/path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a> 
    <a href="/servlet02/index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
    <a href="/servlet02/servlet/DoLogin2">访问servlet的路径</a> <br/>
    <a href="/servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a> 
    
  • 相对路径B(根据文件所在位置访问)------不推荐
    <a href="update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a> <br/>
    <a href="subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a> <br/>
    <a href="../path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a> <br/>
    <a href="../index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
    <a href="../servlet/DoLogin2">访问servlet的路径</a> <br/>
    <a href="../../servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a>
    
  • 相对路径C(根据base标签来优化情况A)--------推荐
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
        <base href="<%=request.getContextPath()+"/"%>">
      </head>
      <body>
      <a href="success.jsp"></a>	//自动包含了根路径
      $END$
      </body>
    </html>
    

三、转发和重定向

转发

转发调用的是req.getRequestDispatcher(“index.jsp”).forward(req,resp);它是在服务器端进行页面跳转的,所以浏览器并不知道它的跳转,浏览器的地址栏仍然是跳转之前的地址
特点
1. 速度快,支持数据共享
2. 但会导致表单重复提交
3. 不会经过过滤器

重定向

重定向用的是resp.sendRedirect(),它会告诉浏览器应该访问哪个地址,然后浏览器再对该地址发出请求。
特点

  1. 由于要让浏览器发送请求,所以效率不如转发
  2. 不支持共享数据
  3. 不会导致表单重复提交

转发和重定向的路径区别

resp.sendRedirect("/servlet03/success.jsp");
req.getRequestDispatcher("/login.jsp").forward(req,resp);

在这里插入图片描述

四、request和response更多请求

requesst

/*******[1]获得req对象中的头信息*(了解)*******************/
		
		Enumeration<String> headerNames = req.getHeaderNames();
		
		while(headerNames.hasMoreElements()){
			
			String next = headerNames.nextElement();
			System.out.println(next+"-----"+req.getHeader(next));
		}
		/*******[2]获得URL地址信息*********************/
		//http
		System.out.println(req.getScheme());
		//127.0.0.1
		System.out.println(req.getServerName());
		//8888
		System.out.println(req.getServerPort());
		//   /servlet/MoreServlet
		System.out.println(req.getServletPath());
		// √  /servlet22   
		System.out.println(req.getContextPath());
		// √ /servlet22/servlet/MoreServlet
		System.out.println(req.getRequestURI());
		// √ http://127.0.0.1:8888/servlet22/servlet/MoreServlet  
		System.out.println(req.getRequestURL());
		// GET
		System.out.println(req.getMethod());
		// √ pwd=123&zh=456
		System.out.println(req.getQueryString());
			
		/********[3]req对象获得值的操作 (重点)****************/
		//获得前台的数据
		String  zh = req.getParameter("zh");
		//获得前台的爱好的选择的多选操作
		String[] hobby = req.getParameterValues("hobby");
		
		/*********[4]获得远程的和本地的信息(了解)*************/
		//获得远程的信息---客户端浏览器
		System.out.println(req.getRemoteAddr());
		
		System.out.println(req.getRemoteHost());
		
		System.out.println(req.getRemotePort());
		
		//获得本地的信息---本地服务器
		System.out.println(req.getLocalAddr());
		
		System.out.println(req.getLocalName());
		
		System.out.println(req.getLocalPort());
		
		/***********[5]获得其他对象的操作(重点)************************/
		//获得session对象
		HttpSession session = req.getSession();
		
		//获得全局的对象
		ServletContext servletContext = req.getServletContext();
		
		ServletContext servletContext2 = this.getServletContext();
		
		//获得cookie对象
		Cookie[] cookies = req.getCookies();
		
		/***********[6]req对象中的其他的方法(重点)*******************/
		
		//解决中文乱码
		req.setCharacterEncoding("utf-8");
		//转发
		req.getRequestDispatcher("").forward(req, resp);
		
		req.setAttribute("msg", "");
		
		req.getAttribute("msg");

response

 resp.setContentType("text/html;charset=utf-8");
		//设置响应回去的编码方式
		resp.setCharacterEncoding("utf-8");
		//设置文本的长度  ---文件下载的时候需要使用
		resp.setContentLength(1024);
		//重定向
	    /*resp.sendRedirect("");*/
		//把cookie对象保存到resp对象中
		resp.addCookie(cookie);
		
		//(了解)
		//在响应头中添加对应的信息如果name一致也不会覆盖
		resp.addHeader("cou", "javaEE");
		
		resp.addHeader("cou", "javaSE");
		//设置指定的响应头信息  name一致会覆盖
		resp.setHeader("cou1", "java");
	
		resp.setHeader("cou1", "javascript");
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:21:07  更:2021-09-19 08:22:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:24:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码