需要上课的人员:

题目一:

程式码如下:

请问Server端可以收到的参数与值为何:

答案:password=yorkP (反白中)

题目二:

程式码如下:

请问Server端收到的参数与值为何?

答案:name=John,location=Boston(反白中)

请答错的同仁进来听课。

资料如何由Client前端传递到Server后端

前端的网页在收集使用者填写的资料,或是程式自订的资料,可以利用几种方法传送到后端,我们一一来介绍。

URL with 参数

Http传送协定中的其中一种--GET,这种传送方式会在网址的后端带上参数到Server,格式为:

URL?key1=value1&key2=value2

其中?是区隔网址与参数,而参数与参数中间利用&区隔,参数与值中间用=区隔。

form submit

form(表单)是HTML标签中的其中一种,它会将在form里宣告的<input … >...</input>、<select … > … </select>、<textarea … > … </textarea>这三种类型的资料送出给Server端,不过有几点要注意的是:

  1. <input … >...</input>、<select … > … </select>、<textarea … > … </textarea>,这些标签必须被包含在<form> … </form>里,并利用submit的方式送出。

  2. <input … >...</input>、<select … > … </select>、<textarea … > … </textarea>,这些标签必须包含一个name的属性,原因是这个属性的值会被当做送到Server端参数的key,所以如果没有key的话,这个值当然也没办法被送出。

 

  • 在初学者之间常常遇到的迷思:

<input type="hidden" id="username" name="username" value="york" />

这一段HTML语法中,id与name到底有什么不同,最大的不同是在form submit时,吃的参数是name,form会把name拿来当参数的key值,所以没有name,这笔参数就不会被送到后端;而id是javascript用来操控方便使用而已,并不会影响到要传送到后端的参数。

 

AJAX

AJAX是比较特殊的一种资料传送方式,因为它算是在javascript中多开一条执行绪,用来即时传送资料到后端并处理接收的资料,其中最特别的方法是它并不会影响使用者的操作,而且接收回来的资料并不会变更整个网址与网页,不像上述的二种方法,在接收Server端回传的网址时,是整个网址与网页都替换掉。

因为AJAX比较特殊,所以它的写法也比较麻烦,下方是很正规的AJAX写法:

可以看到这样的AJAX写法不好理解且不好维护,所以JQuery发展了一套简单的AJAX写法,替代表上述的写法,如下:

Client前端传送资料的设计

虽然前端有这几种方法可以传送资料到后端,不过简单的分类,总共有三种传送的方式:

  1. GET:

网址包含参数,若参数过大会有封包大小限制的问题。

  1. POST:

网址不带参数,若参数过大,浏灠器会自动进行分段传送,所以较不会有封包大小限制的问题,不过因为参数不在网址,所以重新整理时,Server端不会收到参数。

  1. AJAX:

浏览器另开执行绪执行,不影响网页;不过传送回来的资料不会将整个网页重新处理。

因为有三种传送资料的方式可以使用,那到底我们要用那一种方式来传送资料到后端呢?通常会考虑几种情况来决定。

  • 安全性:

GET的资料参数会呈现在网址上,所以很容易被别人看到,如果比较有安全性的问题,不适用GET,例如帐号、密码等。

  • 使用者操作网页重新整理时:

当网页重新整理时,会以目前的网址列重新执行一次,所以POST的资料会遗失,而GET的资料因为带在网址上,所以不会有问题;通常用在搜寻的状态时,会以GET的方式来处理,因为目前页数、查询条件资料都被放在网址列,所以重新整理后会保留。

  • 方便时与即时性:

AJAX的方便在于它不会影响使用者在网页上的操作,而正常的form submit会在资料回传时,将网页整个重组;所以在要不要使用AJAX的思考时,必须考虑这笔资料的传送是否应该让使用者等待后再继续?如果是,那就不应该是使用AJAX,而是应该使用form submit的方式,或是它并不是需要使用者等待的,那就可以使用AJAX;通常在使用者注册时,检查帐密是否重复的确认会使用AJAX,让使用者方便继续填写会员资料。

特殊状况:Checkbox的资料传送与接收

在HTML的资料传输中,通常遇到的情况是一个key配一个value,不过有一种特殊的状况叫做checkbox。

Checkbox的特殊情况在于,每一个不同的value,都会搭配相同的key,例如下图的范例:

可以看到所有的checkbox都是配相同的name,此时送出的封包也是一样,如下图:

这时候后,后端如果使用request.getParameter("vehicle")这种方式来取值的话,会只取到一个值,所以要改用request.getParameterValues("vehicle")这种方式来取,如下图。

Server后端接收资料

当资料由前端传送到后端时,后端即可以透过javax.servlet.http.HttpServletRequest这个物件的getParameter(String key)的方法,根据传入的key来取得对应的value值,而这个方法是很基础的取得参数方法,但通常使用framework的话,都会有更方便的应用,下方我们来看struts2如何帮我们取得前端传送过来的参数。

Struts2自动填入参数

在说明之前,首先有几个必须要了解的:

  • 很多framework都有支援自动填入参数功能,不是只有struts2有做而已。

  • 自动填入参数的功能是引用JAVA的Reflection机制,并以JAVA命名规则为主(即setXxx)。

Action中的参数与命名规则

Struts2的Controller为Action,以前端触发这个Action中的其中一个method并带入参数的情况来说,我们直接来看程式码比较容易了解。

首先是后端Action的程式码:

有一个private属性的field,并且有一个public属性的setQ的method,此时在前端的网页会写成:

根据上一节教过的,这个值被送到后端时,它的key会是q(name="q"),所以Struts2会自动寻找有没有setQ的public method可以呼叫,所以它会自动填入使用者填入的参数并存在query这个变数中,这个就是Struts2帮我们做好的自动填入功能。

进阶版自动填入

上方讲述的是简易版的,接下来我们来看进阶版的功能:

一样在这个Action中有一个private的User属性,而且它带有一个setUser的public method;而这个User的程式如下:

而前端的程式会写成:

这里是JSP的写法,实际上被处理为HTML时,它的语法会变成:

所以被送到后端时,因为key为user.username,所以会自动对到User的username中,而我们在Action中就可以直接使用user这个变数来取得所有对应的资料。

这个自动对应的方法是很好用的,想想,如果今天由我们手动写程式来完成将所有的资料塞到User这个class里面,要多写个好几十行的Code,所以framework真的帮我们省了好多功。

 

相关文章