Servlet学习02
request与response的区别
1.响应对象响应文本数据
1.代码实现:
@WebServlet(name = "Servlet",value = "/demo")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
//request写回浏览器的对象
writer.write("<h1>这是一条来自服务器的一条数据</h1>");
//这是一条使用响应对象返回浏览器的一次响应
}
html通过超文本协议(http协议)向客户端的浏览器响应数据。
2.中文乱码:
**产生原因:**服务器解码没有使用utf-8解码规则
**解决方法:**设置服务器的解码规则,设置为utf-8解码的规则
代码显示:
//设置响应头,告诉浏览器使用utf-8进行解码
response.setHeader("Content-Type","text/html;charset=utf-8");
//或者
response.setContentType("text/html;charset=utf-8");
注意:get请求下和tomcat版本在8.0之后,不需要设置服务器端的编码规则,需要设置响应头设置浏览器的解码方式
2.响应对象响应字节数据
如果要获取或者访问WEB-INF中的文件,需要通过servlet的方式访问文件
注意: 1.浏览器可以直接访问web目录下的文件 2.浏览器不能访问WEB-INF文件夹里面的文件
案例:获取WEB-INF中的文件夹中的图片
- 给前台响应一张图片
- 动态获取WEB-INF下文件的路径,然后使用流将文件封装起来
- 通过响应的输出流写回浏览器
代码实现:
@WebServlet(name = "Servlet",value = "/demo")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//动态获取WEB-INF下面的demo.png的真实路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/demo.png");
//注意在这里查找文件的路径时要加上web-inf这一级的文件名
//将文件封装到流里面
FileInputStream in = new FileInputStream(realPath);
//获取响应中的输出流
ServletOutputStream out = response.getOutputStream();
//进行读写操作,将WEB-INF中的文件封装起来的内容
int len=0;
byte[] bytes = new byte[1024];
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}
3.验证码图片的制作
模板代码:
@WebServlet(name = "CheckCodeDemo",value = "/imgs")
//注解:可以不用使用web.xml配置servlet的虚拟路径
public class CheckCodeDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width=300;
int heigh=200;
//定义验证码图片的宽和高
BufferedImage image = new BufferedImage(width, heigh, BufferedImage.TYPE_4BYTE_ABGR);
//定义验证码图片的类型,类型为枚举类型
Graphics graphics = image.getGraphics();
//获取画笔
graphics.setColor(Color.gray);
//将画笔设置为灰色
graphics.setFont(new Font("微软雅黑",Font.ITALIC,30));
//设置字体的类型,格式(斜体/粗体..),字体的大小
graphics.fillRect(0,0,width,heigh);
//用画笔设置背景图片的颜色
graphics.setColor(Color.red);
//将画笔设置为红色
graphics.drawRect(0,0,width-1,heigh-1);
//设置验证码图片的边框颜色
String str="ascsndjjdkkeioqoiomc1234567890";
//创建 "字库"
graphics.setColor(Color.BLACK);
Random random = new Random();
//定义随机数对象
StringBuffer strb = new StringBuffer();
//创建一个字符串容器
//遍历四个随机数
for (int i = 1; i <=4; i++) {
int num = random.nextInt(str.length());
char charAt = str.charAt(num);
graphics.drawString(charAt+"",width/5*i,heigh/2);
//使用画笔的写字方法,参数1为字符串,参2为字符串在图片的宽的位置,参3为字符在高方向上的位置
strb.append(charAt+"");
//将使用的随机数取出的字符放到容器中
}
//设置干扰线(10条)
for (int j = 0; j < 10; j++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(heigh);
int x2 = random.nextInt(width);
int y2 = random.nextInt(heigh);
//利用随机数创建两个点的位置
graphics.drawLine(x1,y1,x2,y2);
//使用画笔将两个随机点进行来连接,即可生成10条干扰线
}
//因为在注册阶段需要验证码,因此将验证码存放在全局域中
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("imgcode",strb.toString());
//使用ImageIO中的静态方法将画笔中的数据创建成jpg格式的图片并将图片,反映回页面
ImageIO.write(image,"jpg",response.getOutputStream());
}
4.重定向的学习
1.作用:
可以用来进行页面的跳转
2.特点:
- 两次请求,两次响应
- 地址会发生变化
- 既可以跳转外部资源,也可以跳转内部资源
3.代码实现的两种方式:
response.sendRedirect("home.html");
5.请求转发(内部转发)
1.特点:
- 一次请求,一次响应
- 地址栏不发生变化
- 只能跳转内部资源
2.代码实现:
request.getRequestDispatcher("/login").forward(request,response);
3.请求跳转和重定向的区别:
在使用请求域中的数据时,重定向因为是两次请求,两次转发,因此不能获取到请求域中的内容,但是使用内部转发可以获取到请求域中的内容,因为在不断的转发对象。
WEB-INF中的资源,重定向不能访问,内部可以访问
6.路径的书写
页面上的需要写项目路径,重定向的路径需要写项目路径
内部转发不要写项目路径
7.利用注解配置web.xml中的内容
可以代替web.xml中的中的内容
@WebServlet(value = "/demo")
//缩写形式
@WebServlet("/demo")
//一个servlet可以配置多个虚拟路径
@WebServlet(value = {"/home","/demo","/ha"})
//除了value也可以使用urlpatterns这个属性
@WebServlet(urlPatterns = "/demo")