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">
<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);
}
}