java web 学习
servlet 的理解
servlet:java server applet 服务端小程序,它是JSP组件的前身,是java web开发技术的基础和核心组件。Servlet对象给web应用进行了封装,针对HTTP请求提供了丰富的API方法。
1、当服务器接受到请求,会创建request和response对象。
2、会将请求消息数据封装在request对象中。
3、将这两个对象穿阿迪给service方法作为参数与
4、当服务器给浏览器作出响应之前,会去response对象中获取设置的响应消息数据,然后作出真正响应
service(request,response);
1、通过request获取请求消息数据
2、通过response设置响应消息
1.接受请求,服务器创建request和response对象
2.将请求消息数据封装到request对象中
3.将这两个对象传递给service方法,调用service方法
4.在service方法中,我们可以通过request对象来获取请求消息数据,通过response对象类设置响应消息数据
5.在服务器真正作出响应之前,会从response对象中获取出我们设置的响应消息数据。
6.当响应完成,这两个对象将被销毁。
request的全路径:org.apache.catalina.connector.Request
response的全路径:org.apache.catalina.connector.Response
响应头及重定向的理解:
- 设置响应状态码: setStatus(int sc):
- 设置响应头:有三种响应头设置方式
- setHeader(String name,String value):
- setIntHeader(String name, int value)
- setDateHeader(String name, long date)
- content-type:告诉浏览器,当前发送的响应数据的mime类型 以及编码方式。浏览器就会使用相应的解析引擎来解析数据
- response.setContentType("text/html;charset=utf-8");解决中文乱码问题
而重定向就是设置响应状态码为302,设置响应头的key为"location"值设置为跳转的地址(sendRedirect将其封装好,直接使用sendRedirect即可)。
/**
* 完成重定向
* @author super
*
*/
public class ResponseDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*//1.设置响应状态码 302
response.setStatus(302);
//2.设置响应头
response.setHeader("location", "http://localhost:8080/day08/req");
*/
//简化版重定向
response.sendRedirect("/day08/regist.html");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
- 重定向特点:
1.地址栏会发生变化
2.可以访问外部的站点
3.两次请求
response输出:
- 输出一张图片
public class ResponseDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取字节输出流
ServletOutputStream sos = response.getOutputStream();
//2.定义输入流关联图片
String realPath = this.getServletContext().getRealPath("/404.jpg");//获取图片真实路径
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
//3.流的对拷
IOUtils.copy(bis, sos);
bis.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
- 向浏览器设置验证码
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.在内存中创建一张图片
int width = 100;
int height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//设置背景色
Graphics g = image.getGraphics();//获取画笔对象
g.setColor(Color.PINK);
g.fillRect(0, 0, width, height);
//画边框
g.setColor(Color.BLUE);
g.drawRect(0, 0, width - 1, height - 1);
//写入验证码
g.setColor(Color.BLACK);
/*g.drawString("A", 20, 25);
g.drawString("B", 40, 25);
g.drawString("c", 60, 25);
g.drawString("d", 80, 25);*/
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random ran = new Random();
for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(str.length());
g.drawString(String.valueOf(str.charAt(index)), width/5*i, height/2);
}
//画干扰线
g.setColor(Color.GREEN);
for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
//2.将图片输出到页面上去
ImageIO.write(image, "jpg", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
request:请求对象
- 获取请求消息
- 获取请求行:GET /day08/req1 HTTP/1.1
-
getMethod():获取请求方式
-
getContextPath():获取虚拟目录(项目的访问方式)
-
getRequestURI():获取访问的URI /day08/req1
-
getRequestURL():获取访问的URL http://localhost:8080/day08/req1
-
getQueryString():get方式获取请求参数
-
getRemoteAddr():获取客户端的IP地址
-
- 获取请求行:GET /day08/req1 HTTP/1.1
在jsp中获取虚拟目录(项目的访问方式)
<body>
${pageContext.request.contextPath }
<img src="${pageContext.request.contextPath }/checkCode">
</body>
请求头
-
获取请求头:
getHeader():获取请求头
user-agent:获取浏览器的版本信息
下面Chrome浏览器的user-agent的信息Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
请求体:
-
获取请求体:封装的是post请求的请求参数
- BufferedReader getReader():获取字符体
- ServletInputStream getInputStream();获取字节体,用于文件上传(获取文件上传表单数据)
-
通用的获取请求参数的方式:
String getParameter(String name):通过请求参数名称获取请求参数值。
String[] getParameterValues(String name):通过请求参数名称获取请求参数值的数组。一般用于复选框
Map<String,String[]> getParameterMap():获取所有参数的键值对Enumeration<E> getParameterNames():获取所有的名称的枚举
中文乱码问题
- 解决请求参数中文乱码问题
-
通用方式
username = new String(username.getBytes("iso-8859-1"),"utf-8"); -
post方式:
request.setCharacterEncoding("utf-8");
-
//post解决中文乱码问题
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
重定向和转发的区别与联系
-
请求转发:
- 一次请求,一次响应
- 只能转发到内部站点
- 地址栏不会发生变化
-
重定向:
- 两次请求,两次响应
- 发到外部站点
- 地址栏会发生变化
如果想在两个servlet之间共享数据,就需要用到转发
- 域对象:代表一次请求
- getAttribute()
- setAttribute():
- removeAttribute():