JavaWeb学习(六)---Servlet

本文介绍了如何使用Servlet和MyBatis进行动态Web开发,包括Servlet的依赖导入、生命周期、请求处理,以及MyBatis的配置和使用,展示了用户登录和注册的示例代码,详细讲解了请求参数的获取、处理中文乱码问题以及响应数据的设置。
摘要由CSDN通过智能技术生成
Servlet是java提供的一门动态web资源开发技术

在这里插入图片描述
在这里插入图片描述
1.导入依赖

		<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

2.创建实现类ServletDemo1实现Servlet接口,并实现方法。通过@WebServlet配置web访问地址

在这里插入图片描述

结果:
在这里插入图片描述

Servlet执行流程

在这里插入图片描述

Servlet生命周期

在这里插入图片描述

Servlet体系结构

由于每次实现Servlet接口都要复写5种方法,而除了service()方法外的其他四种都不常用,为了消除这种繁琐的步骤,之后所写的Servlet实现类都是继承了HttpServlet类
在这里插入图片描述

Servlet urlPattern配置

在这里插入图片描述
在这里插入图片描述

Request&Response

request:获取请求数据
response:设置响应数据
在这里插入图片描述

Request获取请求数据

在这里插入图片描述

获取请求行数据

//Request获取请求行数据
        //获取请求方式 String getMethod()
        String method=req.getMethod();
        System.out.println(method);

        //获取虚拟目录
        String path=req.getContextPath();
        System.out.println(path);

        //获取URL StringBuffer getRequestURL()
        StringBuffer url=req.getRequestURL();
        System.out.println(url.toString());

        //获取URI String getRequestURI()
        String uri=req.getRequestURI();
        System.out.println(uri);
        //获取请求参数 String getQueryString()
        String queryString=req.getQueryString();
        System.out.println(queryString);

实现:
在这里插入图片描述
获取请求头数据

//获取请求头数据
        //获取UA标识 user-agent:浏览器的版本信息
        String header=req.getHeader("user-agent");
        System.out.println(header);

在这里插入图片描述
获取请求体数据

//获取请求体数据
        //1.获取字符输入流
        BufferedReader br=req.getReader();
        //读取数据
        String line=br.readLine();
        System.out.println(line);
Request通用方式获取请求参数

在这里插入图片描述

Map < String ,String[]> getparameterMap()
 //获取请求参数 String getQueryString()
        String queryString=req.getQueryString();
        System.out.println(queryString);
        //获取请求参数
        Map<String,String[]> map=req.getParameterMap();
        //遍历map获取参数
        for (String key:map.keySet())
        {
            System.out.println(key);
            //获取值
            String[] values=map.get(key);
            for (String value:values)
            {
                System.out.println(value);
            }
        }

实现:
在这里插入图片描述

Request请求参数中文乱码问题

UTF-8下一个汉字占3个字节,GBK下一个汉字占两个字节

//解决乱码问题,post请求方式
request.setCharacterEncoding("UTF-8");

//解决中文乱码问题,GET方式
//乱码原因:tomcat进行url解码,默认的字符集为ISO-8859-1
//解决办法:先对乱码数据进行编码,转为字节数组
String username=request.getParameter("username");

byte[] bytes=username.getBytes(StandardCharsets.ISO_8859_1);
//字节数组解码
username=new String(bytes,StandardCharsets.UTF_8);

URL编码方式实现
//编码
URLEncoder.encode(str,"utf-8");
//解码
URLDecode(s,"utf-8");
Request请求转发

请求转发:一种在服务器内部的资源跳转方式

在这里插入图片描述
实现:
Servlet A:
在这里插入图片描述
Servlet B
在这里插入图片描述
控制台实现:
在这里插入图片描述

Response
Response设置响应数据

在这里插入图片描述

Response完成重定向

在这里插入图片描述

302 资源存在但却临时转换了位置

//简化后的重定向
response.sendRedirect("/tomcat-demo/request2");
路径问题

浏览器端使用:加虚拟目录(项目访问路径)
服务器端使用:不需要加虚拟目录

//动态获取虚拟目录(降低耦合)
String contextPath=req.getContextPath();
resp.sendRedirect(contextPath+"/resp1");
Response设置响应体

1.响应字符数据

//设置响应格式和字符集
//通过Response获取的字符输出流默认编码为IOS-8859-1
response.setContentType("text/html;charset=utf-8");

PrintWriter writer=response.getWriter();
writer.write("aaa");
writer.write("<h1>aaa</h1>")

2.响应字节数据

//获取字节输出流
ServletOutPutStream os=response.getOutPutStream();
//读取文件
FileInputStream is=new FileInputStream("d://123.jpg");
//对拷
byte[] buff=new bute[1024];
int len=0;
while((len=is.read(buff))!=-1)
{
	os.write(buff,0,len);
}
//释放资源
is.close();

对拷也可以使用common-io工具类
添加common-io依赖

在这里插入图片描述
简化后的代码:

//完成流的对拷
IOUtils.copy(is,os);

案例Servlet+Mybatis实现简单的用户注册登录

用户登录

SQL:

-- 创建用户表
CREATE TABLE tb_user(
	id int primary key auto_increment,
	username varchar(20) unique,
	password varchar(32)
);

-- 添加数据
INSERT INTO tb_user(username,password) values('zhangsan','123'),('lisi','234');

SELECT * FROM tb_user;

前端登录:login.html
在这里插入图片描述
SQL映射
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="css/login.css" rel="stylesheet">
</head>

<body>
<div id="loginDiv">
    <form action="/tomcat-demo1_war/loginServlet" method="post" id="form">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>

登录Servlet

package com.itheima;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收用户名和密码
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        //调用mybatis来进行查询
        //获取sqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //获取sqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取mapper
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //查询用户
        User user=userMapper.selectUser(username,password);
        //释放资源
        sqlSession.close();

        //设置响应格式和字符集
        resp.setContentType("text/html;charset=utf-8");
        //设置响应字符数据
        PrintWriter writer=resp.getWriter();
        //判断查询到的user是否为空,若为空,则数据库中无该用户
        if(user !=null)
        {
            //登录成功
            writer.write("登录成功!!!");
        }
        else
        {
            writer.write("登录失败!!!");
        }
        System.out.println(req.getContextPath());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

用户注册
package com.itheima;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

@WebServlet("/reServlet")
public class registerServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer=resp.getWriter();
        //获取用户输入的数据
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        //调用mybatis
        String resource="mybatis-config.xml";
        InputStream is= Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(is);

        //获取sqlsession,并开启事务
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        //获取mapper接口的代理
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

        User user1=userMapper.selectByUsername(username);

        //如果用户不存在,则注册用户,否则,注册失败
        if(user1==null)
        {
           userMapper.add(user);
        }
        else
        {
            writer.write("用户已存在");
        }
        sqlSession.close();
        System.out.println(req.getContextPath());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值