Get请求:速度快,请求信息会暴露出来(安全性不高)
Post请求:信息会在请求内容中提交,不容易看出(安全性高)
服务器端应用特性
1、定义访问接口(网址)
2、解析访问信息,处理业务逻辑
3、返回内容给客户端
服务器工程的结构
1、源码:定义类继承HttpServlet,然后填充具体的访问方法(doGet,doPost)
public class HelloServlet extends HttpServlet {
/**
* 第一个参数表示客户端请求的内容(客户端给服务端的东西)
* 第二个参数表示服务端响应的内容(服务端给客户端的东西)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//处理get的业务逻辑
System.out.println("doGet被出触发");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//处理post的业务逻辑
}
}
2、配置文件,配置WebRoot/WEB-INF/web.xml,定义一个访问地址和Servlet关联
在web-app标签中添加配置
<!-- 注册一个Servlet类 -->
<servlet>
<servlet-name>Hello1</servlet-name>
<servlet-class>com.xykj.test.HelloServlet</servlet-class>
</servlet>
<!-- 配置Servlet访问网址 -->
<servlet-mapping>
<servlet-name>Hello1</servlet-name>
<url-pattern>/test</url-pattern> <!-- http://127.0.0.1:8080/Hello/test -->
</servlet-mapping>
3、返回的页面
Http请求的参数传递
get方式请求:可以将参数直接放在地址中,在地址后用”?”接着参数的”名=值”,多个参数之间用”&”连接
post方式请求:可以将参数写到内容中,多个参数用”&”连接(不需要”?”)
HttpUrlConnection
Get
//1、创建URL对象,创建时可以直接将参数放在网址上
URL url = new URL("http://ip:port/Hello/login?name=java&psw=12");
//2、打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//3、处理结果
int code = conn.getResponseCode();
if(code == 200){
//请求成功,可以读取服务端给的内容
InputStream in = conn.getInputStream();
//处理数据
...
}
//4、断开连接
conn.disconnect();
Post请求
1、创建URL对象,创建时可以直接将参数放在网址上
URL url = new URL("http://ip:port/Hello/login?name=java&psw=12");
2、打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3、设置请求方式为POST,然后做一些其他配置
conn.setRequestMethod("POST");
// 可以输出内容
conn.setDoOutput(true);
conn.setDoInput(true);
// 一般post不使用缓存
conn.setUseCaches(false);
// 提交的内容类型(表单类型)
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
// 连接一下(验证)
conn.connect();
4、将参数写到内容中
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
String value = URLEncoder.encode("张三", "gbk");
String param = "name=" + value + "&psw=8888";
// 写参数到请求内容中
out.writeBytes(param);
out.flush();
out.close();
5、处理结果
int code = conn.getResponseCode();
if(code == 200){
//请求成功,可以读取服务端给的内容
InputStream in = conn.getInputStream();
//处理数据
...
}
6、断开连接
conn.disconnect();
附:关于字节流转为字符流可以使用InputStreamReader或者OutputStreamWriter来转换,如
InputStream in = conn.getInputStream(); //字节流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
服务端的乱码问题
可以将收到的内容以传输时的iso-8859-1的编码转为原始数据byte[],然后再将该原始数据转为目标编码
//接收参数
String n = req.getParameter("name"); // null
//网络上传输的编码一般是iso-8859-1
byte[] temp = n.getBytes("iso-8859-1");
n = new String(temp,"gbk");