Servlet 与 JSP (一)

1. post 请求中的汉字会有乱码问题(重点)

问题引入: 现有一个form表单如下,请求方式为post

<form action="servlet1" method="post" >
       男 <input type="radio" name="sex" value="男" checked>
       女 <input type="radio" name="sex" value="女">
        <input type="submit" value="提交">
</form>

默认选择"男",点击提交后, 控制台打印: 性别是: ç"·  出现乱码了!!!!!!!

为什么在页面中我们传递的明明是 男 ,发过来就变成这样了呢??????

原因: 编码解码字符集不一样,编码用utf-8,解码用ISO-8859-1

        String sex = URLEncoder.encode("男", "utf-8");
        System.out.println(sex);//%E7%94%B7
        //服务器用 iso-8859-1 还原
        String result = URLDecoder.decode("%E7%94%B7", "iso-8859-1");
        System.out.println(result);//ç"·


解决方法,在调用 getParameter 方法之前:

request.setCharacterEncoding("utf-8");

2.request 重要方法(重点)

request.getParameter("参数名") ==> 返回参数值
request.getParameterValues("参数名") ==> 返回参数值的数组
request.setCharacterEncoding("解码的字符集");

request.getMethod(); ==> 返回请求方式 get, post
request.getRequestURI(); ==> 返回当前的请求路径
request.getRemoteAddr(); ==> 获取访问者的ip地址

3. 一个请求分几个部分

GET 两个部分
GET 路径/HTTP 1.1   ==> 请求行
请求头
    Host: 要访问那个虚拟主机 一个服务器下有多有 host, 每一个host 下,又有多个应用程序
    Accept: 可以处理的内容格式:例如 text/html
    Accept-Encoding : 能够支持的压缩格式
    Accept-Language : 支持的语言, 例如 zh-CN


POST 三个部分
    Content-Type: 请求体的格式 application/www-form-urlencoded (普通表单格式)
    Content-Length: 请求体内容的长度

除请求行,请求头外,还有请求体
请求体
    post的请求参数放入了请求体当中,例如:username=zhangsan&password=123
    如果有中文,会自动编码 

4. 响应分成3个部分

1) 状态码

    * 200 表示响应正确返回
    * 404 表示请求的资源不存在
    * 500 表示服务器内部出现了异常
    * 304 表示该内容没有被修改,那么服务器只会返回状态码和头,不需要返回响应体(图片,html,css,js)
    * 400 请求参数格式有误.
    * 403 验证没通过,或权限不足

2) 响应头
    * content-type: 响应的内容格式, 例如 text/html;charset=utf8
    * content-length: 响应体的长度(字节)
    * Date: 响应生成时间
3) 响应体
    html内容,图片内容

 5.返回一个动态图片

例如:生成一个动态验证码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function changeImage() {
            document.getElementById("img").src= "servlet2?a=" + new Date().getTime();
        }
    </script>
</head>
<body>
    <img src="servlet2" onclick="changeImage()" id="img">
</body>
</html>
@WebServlet(urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 图片验证码
        // 1. 创建图片对象, 构造参数分别代表 宽、高、图片格式
        BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);

        // 2. 创建画布对象
        Graphics2D g = image.createGraphics();

        // 3. 填充画布
        g.setColor(Color.GREEN);
        g.fillRect(0,0,200,100);
        // 写入文字
        g.setColor(Color.BLACK);
        g.setFont(new Font("微软雅黑", Font.ITALIC, 32));
        String s = random(4);
        g.drawString(s, 0, 32);

        g.setColor(Color.RED);
        g.drawLine(0,0,200,100);

        // 4. 把图片内容输出到响应
        resp.setContentType("image/png");
        // 参数1 图片对象, 参数2 图片压缩格式 png|jpeg, 参数3: 输出字节流
        ImageIO.write(image, "png", resp.getOutputStream());
    }

    Random random = new Random();
    String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    public String random(int n) {
        StringBuilder sb = new StringBuilder(n);
        for (int i = 0; i < n; i++) {
            int idx = random.nextInt(str.length()); // 随机的下标
            sb.append(str.charAt(idx));
        }
        return sb.toString();
    }

}

6.请求转发(重点)

servlet 中用来处理表单请求  

      跳转至jsp (请求转发) 

jsp 用来生成html代码并返回

request.getRequestDispatcher("jsp路径").forward(request, response);

 如何把servlet中的变量传递给jsp显示?  作用域传参

存  (在servlet)

request.setAttribute("变量名", 对象);

取(在jsp页面),通过 EL 表达式取

${ 变量名 }
${ 变量名.属性名 }    el 表达式中的属性名,对应着java对象中的 get,set方法名

例如: 查询数据库,并把结果显示在jsp页面

@WebServlet(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet中执行了操作...");
        // 查询了数据库
        User user = new User("张三", "123");

        // 向作用域存储变量, 向 request 作用域存储了一个名 u 的对象
        req.setAttribute("u", user);
        req.getRequestDispatcher("jsp2.jsp").forward(req,resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    返回的html信息
  <!-- 获取作用域中的变量 -->
    ${ u }    <!-- User{name='张三', password='123'}-->

    ${ u.getPassword() }   <!--123-->
</body>
</html>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值