1 案例1-用户注册

1.1 需求

当用户在页面上填写完信息之后,点击注册按钮,将用户填写的信息添加到数据库中;

1.2 技术分析

1:直接复制原型页面到工程中,即可拥有一个表单页面了;(html,form)
2:将表单填写的信息提交给servlet;(Servlet,Request)
3:在servlet中获取所有的参数键值对,使用一个工具类即可将map中的数据封装到一个javaBean对象中;(BeanUtils)
4:将javaBean的数据保存到数据库中;(DbUtils)

1.3 Request对象概述

Reqesut对象是HttpServletRequest数据类型的对象,由tomcat服务器在用户发出请求的时候负责创建出来,且每次请求都会创建一个新的对象。

1.4 Request对象的作用

Request对象是代表着用户请求的一个对象;
1:操作请求行
获取请求方式:getMethod
获取资源路径:getRequestURL
获取协议名称:getProtocol
获取用户的ip:getRemoteAddr
2:操作请求头
getHeader(“请求协议中规定的属性名”);
3:操作请求体
只有post提交的时候才有请求体,且请求体中都是键值对形式的参数;
在HTTPServletRequest这个接口中,对操作请求体进行了优化,优化后一共封装了3个方法,可以直接使用这3个方法获取request对象中的参数:
getParameter(属性名)
getParameterValues(属性名)
getParameterMap()
注意:
1:由于这3个方法是优化后的方法,因此既能获取请求体中的参数,也能获取请求行中的参数;
2:只能对post请求体中的参数进行中文参数乱码处理,没有对get请求行中的参数进行乱码处理(get请求需要程序员通过代码解决中文乱码问题)。
解决post请求中文乱码问题的代码是: request.setCharacterEncoding(“utf-8”);

1.5 中文参数乱码问题

原因分析:
浏览器发送get请求的中文参数乱码原因分析与解决方案.jpg
解决方案步骤:
1:使用乱码后的字符串用iso8859-1的编码格式进行编码会得到原来的字节数组。
2:使用字节数组,加utf-8的编码格式,进行解码,就会得到原来乱码前的原始字符串。

代码格式:
String 不乱的字符串=new String(乱码后的字符串.getBytes(“iso8859-1”),”utf-8”);
注意事项:
上述解决方案实际上是一个通用的解决方案。(无论get还是post都会生效),在实际开发中出于对性能的考虑,通常会分开处理get和post的中文乱码问题。
参考代码:

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. * 解决中文参数乱码问题
  8. */
  9. public class Request_中文参数 extends HttpServlet {
  10. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. //1:获取参数
  12. String un = request.getParameter("username");
  13. String sex = request.getParameter("sex");
  14. //2:直接使用get的方式,进行解决
  15. un=new String(un.getBytes("iso8859-1"),"utf-8");
  16. sex=new String(sex.getBytes("iso8859-1"),"utf-8");
  17. System.out.println("姓名:"+un+"; 性别:"+sex);
  18. }
  19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. doGet(request, response);
  21. }
  22. }

1.6 BeanUtils

1.6.1 概述

BeanUtils是一个专门用于数据封装的一个工具类;
可以将map中的数据,直接根据一个类中的成员变量名,自动匹配,完成数据的封装;
特点:
1:可以自动完成字符串与基本数据类型之间的互换;
2:可以字符串与字符串数组之间转换;
3:默认不支持字符串转日期,如果有这个需求,需要程序员写转换器对象;
注意事项:
被封装的javaBean必须有相应的getXxx与setXxx方法;

1.6.2 使用步骤

1:从网上下载并解压zip文件;
2:将核心jar包复制到web-inf/lib目录下;
3:直接使用核心类的封装数据的方法即可;
核心类:BeanUtils
封装数据的方法:populate(javaBean,map);

1.6.3 BeanUtils工具类的优化

由于BeanUtils默认不支持日期类型的数据封装,因此我们对BeanUtils进行二次封装,完成日期数据类型的封装。
参考代码:

  1. public class MyBeanUtils {
  2. public static void populate(Object o,Map<String,String[]> m) throws Exception{
  3. ////由于涉及到了日期的封装,因此,在封装数据之前,必须先设置DateConverter对象支持的日期格式
  4. DateConverter dc = new DateConverter();
  5. //2:设置dc支持的日期格式字符串
  6. dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd","yyyy年MM月dd日"});
  7. //3:注册转换器与指定的数据类型进行关联
  8. ConvertUtils.register(dc, Date.class);
  9. //4:封装数据
  10. BeanUtils.populate(o, m);
  11. }
  12. }

1.7 案例步骤

1:搭建环境;(页面原型直接复制即可)
2:创建3层包结构;(web,service,dao,domain,utils)
3:根据页码编写模型类和数据库表;
4:修改html页面的表单信息;
5:编写servlet,用于获取表单中的数据;(参 调 存 转)
6:编写service和dao操作数据库;

2 案例2-登录优化

2.1 需求

当用户在登录页面填写的信息错误的时候,还让用户回到登录页面,并且在登录页面提示用户登录失败的信息;

2.2 技术分析

实现的方式有两种:
方式1:
在servlet中直接使用字符串拼接html页面上的所有标签,并将错误信息拼接到html标签中即可;
(实际开发时,肯定不用,因为拼接太麻烦了)
方式2:
使用jsp技术,可以直接在html页面中写一部分java代码即可完成效果;
(开发中使用的方式)

2.3 Jsp概述

Jsp的实质就是一个servlet,可以处理用户的请求,也可以对浏览器做出响应,但是在开发中,通过仅使用jsp显示数据。比html的好处,是可以直接从servlet向域存的数据获取一部分信息。
通俗的理解:
Jsp= html+java;
在html页面上允许写java代码;

2.4 Jsp能干啥?

主要用于展示数据,可以替代html,因为有从服务器上直接获取数据的能力。

2.5 Jsp的入门

1:直接创建一个jsp文件;
2:修改文件的编码格式为utf-8;(可以直接修改jsp模板的编码做到一劳永逸)
3:直接在jsp页面上编写html标签代码;(实质上,tomcat会自动将这些标签以字符串拼接的方式响应给浏览器);

2.6 Jsp的脚本标签

脚本标签有3种,常用的有两个:
<% java代码; %> 会翻译到service方法中,不会出现在浏览器页面。
<%= java表达式,也可以是变量名 %> 这里面的代码会被tomcat翻译到out.write(这里),会出现在浏览器页面。
<%! 写方法; %> 会翻译到servlet类中,成为一个方法;(了解,今天不用以后也不用,开发中更不用)。

2.7 Request对象的其他作用(重点)

(1)request可以作为容器使用,可以存值也可以取值(仅浏览器发出请求的时候,容器开始生效,响应完成的时候,容器死亡)
setAttribite(属性名,属性值)
getAttribute(属性名)
removeAttribute(属性名)
(2)request对象可以进行转发操作
转发:是服务器内部的一个行为,从A处转到B处….
对于浏览器来说,浏览器是不知道服务器内部的转发行为的。
转发的过程中request对象并没有死亡,因此在request对象存的值,依然有效。
通常都是在servlet中使用request存值,转发到jsp页面,在jsp页面通过reqesut对象取值;
转发的代码格式:
request.getRequestDispatcher(“/必须斜杠开头,代表的是工程名”).forward(request, response);
此处理解成webcontent也可以,因为编译后webcontent也没有了,工程下直接就是webcontent下的内容
举例:
image.png

  1. public class MyServlet1 extends HttpServlet {
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //1:向reqesut对象中存值
  4. request.setAttribute("username","迪丽热巴");
  5. //2:转发到attr2.jsp页面
  6. request.getRequestDispatcher("/attr2.jsp").forward(request, response);
  7. }
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. doGet(request, response);
  10. }
  11. }

2.8 转发与重定向的区别

区别:
1:转发是一次请求,一次响应(仅仅是服务器内部行为)。而重定向是两次请求,两次响应;
2:转发只能在工程内进行,而重定向可以到任意位置;
3:转发后地址栏不变。而重定向会变。
二者的选用规则:
如果是服务器内部的资源,建议使用转发;
如果是服务器外的资源,只能使用重定向;