ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day032 request & jsp

2021-04-12 23:57:27  阅读:115  来源: 互联网

标签:请求 request html 乱码 day032 jsp servlet 页面


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的中文乱码问题;

参考代码:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 解决中文参数乱码问题
 */
public class Request_中文参数 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1:获取参数
        String un = request.getParameter("username");
        String sex = request.getParameter("sex");
        //2:直接使用get的方式,进行解决
        un=new String(un.getBytes("iso8859-1"),"utf-8");
        sex=new String(sex.getBytes("iso8859-1"),"utf-8");
        System.out.println("姓名:"+un+";  性别:"+sex);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

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进行二次封装,完成日期数据类型的封装;

参考代码:

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

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

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

}

2.8 转发与重定向的区别

区别:

1:转发是一次请求,一次响应(仅仅是服务器内部行为)。而重定向是两次请求,两次响应;

2:转发只能在工程内进行,而重定向可以到任意位置;

3:转发后地址栏不变。而重定向会变。

二者的选用规则:

如果是服务器内部的资源,建议使用转发;

如果是服务器外的资源,只能使用重定向;

标签:请求,request,html,乱码,day032,jsp,servlet,页面
来源: https://blog.csdn.net/mustang_yl/article/details/115648317

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有