html中表单的action属性作了什么?

表单一般是浏览器实现的,当然也有编程语言,比如python的post方法,然后配合任意一门后台语言比如javaweb来获取post数据。
在此声明,post不安全。post和get的详细区别请先研究http协议详细的规格再结合浏览器F12抓个包详细看。(或者wireshark,如果你用的https的包还是用浏览器方便)
因为是浏览器实现的,所以post也是明文的!!!
从wireshark抓包看到是明文的。
表单的几个属性非常重要。
name属性如果写,则提交表单时才会带上这个数据。
且Post是由&分割的。
也就是说你这样:
URL?a=1&b=2
post也是这样,只不过post跟在了request body里面。
关于请求和响应,一句话概括:
请求:请求行,请求头,请求体(简单的参数传递)
响应:响应行,响应头,响应体(html/css/js/image/mp3/m3u8/...)
然后跟在一堆请求包里面。
响应表单中有name属性的则是:
请求行…
请求头…
请求体:
a=1&b=2

<form action=”URL”></form>

这个URL非常的坑。故且可以理解为绝对URL和相对URL。
知道参数是URL。
那么,什么是URL?
我讲个故事。
以前的一群科学家们在用美国二战时留下的网络时,想搞1个分布式系统。当时想的是制造这样一种网络,可以让人点一下,就可以访问位于某个Ip的机器的资源。由于这种点一下点一下的方式,(你可以把鼠标放到1个超链接上,看到鼠标变成了抓手模样)实在是太棒了。于是好多不搞计算机的也加入近来,他们也让自己的及其变成服务器,这样他们就组成了一个巨大的分布式系统。而这个系统就是www,简称web。

围绕着web,就有好多事情。最重要的就是关于浏览器和服务器。这两个都是建立在操作系统之上的应用层软件。前前后后美国的几个大公司都参和了不止一脚,每参和一脚就会让前段程序员气到骂娘。
总之,有一群无聊的人让http协议成了www明面上使用最广的协议,围绕着http,聚集着一堆增值服务,因为http太简陋,没啥玩的。这就好比我买了个树霉派结果没买配套硬件一样。。。
总之呢,怎么确定这个大的分布式系统中我,要到哪里,去抓某个资源呢?也就是<a href=""写什么呢?如果中国银行写了www.bank.com,美国银行也写了www.bank.com,那不就乱了么?这个时候,就需要唯一的确定某个地址。所以啊,用wireshark抓一下包就会发现一堆DNS流量,其实就是去干这个事情了。那其中肯定会牵扯到金钱交易,毕竟域名服务器帮你解析了麻,虽然干的活简单,可是架不住这么多人用,你也没办法。这就是标准的重要性。
再来看看URL的格式就会发现一些有趣的事情。
协议名://主机名:端口/路径,我们写form表单,让浏览器去请求的时候,其实我们只需要写baidu.com,但是浏览器在拿到这个字符串后立刻变成了http://www.baidu.com,然后去取资源。
www.baidu.com这台主机,然后返回一个index.html这个页面。这样就ok了。

所以我们form表单在写的时候写的/代表什么呢?
根路径,到底是相对于谁的根呢?
是后台代码的根呢?还是什么?
我们需要深入理解服务器程序的设计。
早期的html也就是静态页面,没什么好纠结的。服务器也就是看客户端要取这个资源,然后就返回对应的html页面。在这种情况下,服务器不需要跟客户端保持一个连接,注意,http是无连接的。它虽然是基于tcp协议,tcp协议保证了可靠连接,但是http并不会建立连接,就是一个简单的请求(get/post/head/…),响应。这种情况下服务器是不需要跟你保持1个连接的。你上web也很无聊啊,就是看看这个站点发布了什么,连个交互都没有。可是你要知道,今天web遍布全球,所以这种情况是不会持续很长时间的。于是,http马上升级到了1.1,但其实是优化了客户端的上网速度而已。这中间有些技术出来搅混这谭水,比如java applet。这是什么呢?就是服务器有个小程序,叫做applet,然后发给你的浏览器,你的浏览器就可以动态的给你展示一些内容,就像服务器给你提供的服务一样,不过这时是缓解了服务器的压力。想象一下,当时可能有个人发了个有趣的小游戏,然后放到一个大论坛,这时很多人都下载然后去玩。是不是好快乐?但是这就暴露了安全问题。导致后来哪怕是cookie那个RFC草案的提出,都会被无限放大为侵入计算机系统的病毒,估计就是这个时候人们变得草木皆惊了。然后出现了像php这样的脚本语言。所谓脚本是什么呢?就是浏览器不是传过来1个请求麻,然后解析一下,毕竟是html页面而已,服务器抓去到事实上的请求地址,就开始去解析,然后可能还经过了各种库的处理,ok,服务器处理完了,就把处理好的数据再塞到html页面发给浏览器里面。
所以,form的action属性其实是说,我这里有post的数据(一般form也都是post请求),我要发送到这个action这个url下面。通过url可以唯一的确定服务器的地址。–服务器默认端口是80,协议是http。所以,
协议名://主机名:端口/路径已经知道了协议名://主机名:端口,就剩路径了。你要知道,现在的服务器你给的路径都不是某个具体的脚本文件了,而是服务器的内部路径,也就是一串字符串,你看不出规律的,这即方便也安全。不然我抓个图看看:

在这里插入图片描述

可以看到,支付宝的action地址是详细的URL,虽然指向的是本页面。
所以,action作了把数据送到这个URL定位的资源上面。资源可以是超文本,视频,音频,甚至动态处理的脚本语言,服务器的某个处理路径…
顺便说一下,想实施发送一个post,需要在form中写<input type="submit"<button onclick="函数"来发送post或触发js发送post请求。
但如果post到的地址它不接受,服务器找不到等,那这个数据就发送不了。
那么,<form action='#'干了什么呢?
#简单的来说是把数据送到了当前页面进行处理,action什么都不加或者干脆不写action都是把数据送到当前页处理,#是比较老的写法了。
再说说后段怎么办。
action可以是绝对URL,和相对URL。绝对的就参考支付宝的写法,是https就写443,否则写80。因为考虑是绝对的就写全为好。
回想一起那我写的这几篇文章:
https://blog.csdn.net/u010563350/article/details/81147457
https://blog.csdn.net/u010563350/article/details/81351274
https://blog.csdn.net/u010563350/article/details/81351280
,
所以,写绝对路径绝对是无可争议,而且不容易出错。而写绝对路径比较省力的写法,(也是避免把页面写死的办法)就是后两种。
当然也可以看看这篇文章:https://blog.csdn.net/lutinghuan/article/details/6450174?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param
,所以,就是找到了项目的主页嘛。其中的get什么的都是tomcat提供的方法而已。
然后就是tomcat在运行时在response时会把其中的替换掉。
然后就是相对路径了。
相对路径会写/开头,/项目名/才到改项目的根。有几点非常不友好,1.Linux中的绝对路径是以/开头,这就容易让人先入为主而混淆。
2.在服务器,例如tomcat中,生成html页面发送给客户端的时候会先看自身的配置。这个时候如果需求变了,想要把路径改改,会造成非常大的困扰。
为了让你们再少走点坑,我所幸把路径这个坑给你们将清除了。
在linux中,目录以/分割,
在windows中,目录以’‘分割。
但是Java它处理’'是有点毛病,必须得\\代表1个\。也就是你想要D盘的这个路径D:\MySite\WebContent\WEB-INF的文件,你必须这样写:D:\\MySite\\WebContent\\WEB-INF。其他编程语言是没这个坑的。\一般用来指逃避字符,也就是把1个正常的字符转化为特殊的含义,有人也称为转移字符。
这也就是Java文件时必须这样:File f = new File("D:\\MySite\\WebContent\\WEB-INF");的原因。而且Java还不支持多行字符,类似于python和go中这样的写法:

#python
str='''

bala1
bala2
bala3

'''
//go
str :=  ```
bala1
bala2
bala3
`` `

这些说到底是文件系统的路径问题了。Linux沿用的Unix文件系统的路径,而Windows沿用的是Dos系统的文件路径。Linux最初是找着Unix抄的操作系统,Windows最初是照着Dos改的MsDos系统加的外皮。
而相对路径我认为最简单的方式是看浏览器的地址栏,查找当前所在路径,然后再根据这个文件(jsp)找到对应的路径。
在这里插入图片描述
这个说的很清除,但是不建议使用相对路径。后面的框架会自己处理类似的路径,而不依赖与具体的服务器。如spring框架,甚至隐藏自己的路径。
https://blog.csdn.net/bbb695480667/article/details/53838321#commentBox
这篇写的也不错。

建议

都写成绝对路径(某些情况下使用相对路径更监简单,不用用代码获取路径),绝对路径的URL的协议名,主机域名,端口,这些靠代码来动态获取。(代码规范由JavaEE提供,因此具有通用性)

前端的form表单怎么写?

1.现在当前jsp页面中写:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<head>

<%

    String path = request.getContextPath();

    // 获得项目完全路径(假设你的项目叫MyApp,那么获得到的地址就是http://localhost:8080/MyApp/):

    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()

            + path + "/";

%>

</head>
2.然后在form表单中这样写:
<form action="<%=bashPath%>login.jsp" method="post">
	    username:<input type="text" value="" name="username" id="username"/>	<br>
		password:<input type="password" value="" name="password" id=""/><br>
		<input type="submit" value="submit" name="" id=""/>
</form>
3.这样服务器端:http://localhost:8080/MyApp/login.jsp就收到了用户名和密码。
如果是sevlet则把login.jsp换成loginServlet
http://localhost:8080/MyApp/loginServlet

后端的转发和重定向方法怎么写?

重定向是给浏览器地址让浏览器去找自己的资源,因此这种情况下必须给全部的URL。即完全URL
这个时候的/代表了外部路径http:localhost:8080,因此需要给出项目名,写成:/MyApp/login.jsp的样子。


/*
 * 重定向有三种路径书写方式
 * 		1.绝对路径
 * 		2.以"/"开头的相对路径
 * 		3.不以"/"开头的相对路径
 */
public class RedirectServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");
		/*
		 * 2.以"/"开头的相对路径
		 * 		此时,/代表整个web工程的路径,即http://localhost:8080/
		 */
//		response.sendRedirect("/javaee/jsp/b.jsp");
		/*
		 * 3.不以"/"开头的相对路径
		 * 		此时是相对于当前资源的相对路径
		 * 		当前资源路径为:http://localhost:8080/javaee/RedirectServlet
		 * 		即表示:RedirectServlet在路径http://localhost:8080/javaee之下
		 * 		而b.jsp在http://localhost:8080/javaee/jsp/b.jsp
		 * 		所以最终地址写为:jsp/b.jsp
		 */
//		response.sendRedirect("jsp/b.jsp");
		
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
 
}

转发不同,转发是内部找内部的资源,因此使用绝对的URL服务器是不认识的。因此使用相对路径。
因为这个时候是在项目内部,因此/的含义是当前项目内部的资源根路径(不是文件系统根路径),也就是从外部看http://localhost:8080/MyApp/这个地址。

/*
 * 服务器端的路径不能是绝对路径,只能是相对路径,也分为以/开头和不以/开头两种
 * 		1.以"/"开头的相对路径
 * 		2.不以"/"开头的相对路径
 */
public class DispatcherServlet extends HttpServlet {
 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.以"/"开头的相对路径
		 * 		此时,/代表当前web项目,即:http://localhost:8080/javaee
		 */
//		request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
		/*
		 * 2.不以"/"开头的相对路径
		 * 		相对于当前资源的相对路径
		 * 	此时,当前资源的路径为:http://localhost:8080/javaee/DispatcherServlet
		 *  所以要转发去的资源的路径以:http://localhost:8080/javaee开头
		 */
		request.getRequestDispatcher("jsp/b.jsp").forward(request, response);
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

改进,转发用ServletContext获取路径


/*
 * ServletContext获取资源必须是相对路径,不能是绝对路径,但不管是以/开头,还是不以/开头,
 * 都是相对于当前资源的相对路径
 * 
 */
public class ServletContextServlet extends HttpServlet {
 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String path1 = this.getServletContext().getRealPath("/a.properties");
		String path2 = this.getServletContext().getRealPath("a.properties");
		System.out.println(path1);
		System.out.println(path2);
		//输出的地址一样
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
 
}
//上面是规则,下面是代码:

下面以一个管理系统为例进行说明:
该管理系统没有注册功能,就是管理员进行操作添加管理员从而得到用户名和密码。
sc为学生选课管理系统的缩写。

//1.访问http://localhost:8080/sc页面
//默认的,web.xml设置的欢迎页面是http://localhost:8080/sc/login.jsp
//2.用户输入用户名和密码,然后发送到
//http://localhost:8080/sc/LoginController
//3.Controller进行后端的用户名和密码校验,
//如果成功则重定向用户到http://localhost:8080/sc/index.jsp
//失败则重定向到http://localhost:8080/sc/login.jsp。
public class ServletContextServlet extends HttpServlet {
 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	
		
		
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);

//此时的index.jsp和login.jsp都在

		
	}
 
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值