Servlet 一共这么多东西。要会总结:
Servlet-àGennericServleàHttpServlet
ServletConfig ServletContext
/ServletResponse/HttpServletResponse
ServletReruquest/HttpServletRuqest
一个惊天秘密,response和request都是站在服务器的角度而言的。我们做的是服务器编程
Response是往客户端浏览器发数据,request是获取客户端浏览器的数据。
JSP与servlet获取值的问题。
(单选,多选框是通过value值传递的,共同特点是通过name识别的不单是JSP中,PHP是也是这样做的。)
<form action="servlet/ThirdServlet" method="post">
<input type="text" name="username"/ >
<input type="password" name="password"/ >
<input type="checkbox" name="hobby"value="football"/ >足球
<input type="checkbox" name="hobby"value="f2"/ >足球1
<input type="checkbox" name="hobby"value="f3"/ >足球2
<input type="radio" name="gender"value="m"/>男
<input type="radio" name="gender"value="f"/>女
<input type="submit" value="tijiao"/>
</form>
response.setContentType("text/html");
Stringusername = request.getParameter("username");
Stringpassword = request.getParameter("password");
String[]values = request.getParameterValues("hobby");
Stringsingal = request.getParameter("gender");
System.out.println(Arrays.asList(values));
response.getWriter().println("name:"+username+" "+"password:"+password
+" "+"hobby:"+Arrays.asList(values)+" "+"gender:"+singal
);
Enumeration<String> e = request.getParameterNames();
while(e.hasMoreElements()){
StringparamName = e.nextElement();
StringparamValue =request.getParameter(paramName);
System.out.println(paramName+":"+paramValue);
}
Map<String,String[]> map = request.getParameterMap();
Set<Map.Entry<String, String[]>>set3 = map.entrySet();
for(Map.Entry<String, String[]>maps:set3){
System.out.println(maps.getKey()+":::"+Arrays.toString(maps.getValue()));
}
又发现一个惊天秘密: JSP页面中的pageEncoding="gbk"的作用有两个,
第一个负责把JSP页面转换成Servlet时间用什么样的编码。
第二个在Servlet中我们看到了这样一句话,response.setContentType("text/html;charset=gbk");说明我们的这个表单页面在提交的时间是按照GBK编码进行提交的,更重要的是,这句话告诉了浏览器我是什么样的编码,我要以什么样的编码提交,那么浏览器会自动选择相应的编码方式。浏览器的如何为网页选择正确的编码方式如何自动选择就是按照我们在JSP页面中指定的编码方式。
总结:pageEncoding指定了浏览器要用什么的编码显示这个网页,还指定这个网页在发送数据时间以哪种编码发送,根本上是指定转换成servlet用什么样的编码,并且设置setCotentType()这个响应消息头才是浏览器真正识别它是什么编码的原因。
既然以这种方式编码传了过去,那么服务器必须要知道以哪种方式解码,按照常理,http协议应该提供这样一个方法让服务器获取提交页面的编码方式,因为我们有时间可能并不知道客户端浏览器用什么的编码,可是它没有这样的方法这是它的严重缺陷,所以我们只能手工这样设置,告诉服务器你用什么的的方式解码:request.setCharacterEncoding("gbk");此时服务器就已经能够获取正确的数据,能够在服务器端打印出来,至于服务器如何发送给客户端,这是服务器自己决定的,与它发过来的数据已无任何关系,所以我们用response.setContentType("text/html;charset=utf-8");确定发送给浏览器用UTF-8的方式,两个过程是完全独立的。所以此时在提交表单的时间浏览器自动选择了编码为GBK,此时在结果页面我们惊奇的发现它又变成了UTF-8。根据前面学习HTTP协议的问题,这个浏览器的编码完全是由setContextType决定,所以我们最本质的东西都是在servlet里面设置了这个方法。以后JSP绝对无乱码。
注意还有一点request.setCharacterEncoding只对实体内容起作用,对消息头不起作用即只对POST提交起作用,对GET不起作用。那么如何解决GET方式提交的乱码呢?即如果GET方式提交的有中文、怎么办?在Server.xml里面的<ConnectorURIEncoding=”UTF-8”/>即可。但是这种方式只有在tomcat里面有用,所以这个方法不通用。用另外一种方法解决GET乱码问题。
newString(joinValues.getBytes("ISO8859-1"),"utf-8");
请求参数的乱码问题。
其实很简单,你判断一下,如果提交方式是GET,并且是中文,那么可以对这个,其实就是通过URL传过来的中文如何处理,就一步:
Username = newString(username.getByte(“ISO-8859-1”),”UTF-8”);
Button和submit的区别?
表单中<inputtype=”text”/>不可能被提交,
<input type=”submit” value=”提交”/>
这个按钮不能够被提交,在HTML表单中能不能提交给服务器就看这个表单中有没有name,有name的就能够提交,没有的就不能够提交,一个页面中多个提交按钮的判断.
<input type="submit" name="b1"value="add"/>
<input type="submit"name="b2" value="delete"/>
//获取某个按钮:就相当于根据name值获取value值.
String addString = request.getParameter("b1");
// String deleteString = request.getParameter("b2");
if (addString.equals("add")) {
response.getWriter().println("add...");
}else {
response.getWriter().println("delete...");
}
所有表单的实质就是根据页面的name值,获取传过来的value值 .如果没有name值,就不能可能传过去 .
图片作为提交按钮的方法:
<img src=http://www.baidu.com/logo.png name=”test”/>
这个东西会提交过去,而且它有名字会提交过去,test的值会被传过去,并且
有点击位置的坐标.
正常的图片是这样显示的:
<img type=”image” src=”http”//www.aa.com/og.png”/>能够显示,不能够点击.
上传文件时间,method只能用post.并且要加上enctype=”multipart/form-data”虽然此时可以上去了,但是,其它数据又得不到了,所以JSP和servlet不能上传,要引用一个新的jar包,
关于传值,记住一句话,先写name,然后根据name值获取value值 .
防止盗链: