Tomacat是一个Web服务器:
封装HTTP协议操作,简化开发;
可以将web项目部署到服务器中,对外提供网上浏览服务。
Tomcat 部署项目
IDEA中使用 Tomcat方式1 – 部署Web项目
Servlet
Servlet 是 Java提供的一门动态web资源开发技术。(动态资源)
Servlet 快速入门
上述的访问地址:http://localhost:8080/web-demo/demo1
http://localhost:8080为找到tomcat
web-demo为找到模块
demo1为找到Servlet
1.Servlet 由谁创建?Servlet方法由谁调用?
答:Servlet由web服务器创建,Servlet方法由web服务器调用。
2.服务器怎么知道Servlet中一定有service方法?
答:因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法。
Servlet生命周期
实现Servlet接口时重写的三个方法:
比如,一个人出生(init),吃饭(service),死亡(destroy)。
若要在Servlet未被执行时就进行init()初始化,则:
Servlet 体系结构
快速新建类继承HttpServlet:
然后就会自动生成代码:
HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doXXX方法。
Servlet urlPattern配置
@WebServlet有两种方式写:
1.@WebServlet的value属性配置Servlet的访问路径—@WebServlet(value =”/demo04”)
2.@WebServlet的urlPatterns属性配置Servlet的访问路径—@WebServlet(urlPatterns = “/demo04”)
一个Servlet可以配置多个访问路径—@WebServlet({“/demo041”,”/demo042”})
value,urlPatterns都可以省略!
urlPattern配置规则:
前缀匹配(目录匹配)和后缀匹配(扩展名匹配)不能同时出现在一个地址中,否则会出现异常。
用XML配置Servlet
Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持 XML 配置文件的配置方式。
步骤:
1.给Servlet取名字;
2.给Servlet配置访问路径。
具体操作如下:
在web.xml中编写
Request获取请求数据
Request 继承体系
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中;
2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口。
请求数据方法
请求行
// 演示Request获取请求数据
// 浏览器访问: /req2.html
@WebServlet("/req02")
public class RequestDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求行:GET
// String getMethod():获取请求方式 GET
System.out.println("getMethod:"+request.getMethod());
// String getContextPath():获取项目(模块)访问路径 /day24
System.out.println("getContextPath:"+request.getContextPath());
// StringBuffer getRequestURL(): 获取URL http://localhost:8080/day24/req02
System.out.println("getRequestURL:"+request.getRequestURL());
// String getRequestURI():获取URI /day24/req02
System.out.println("getRequestURI:"+request.getRequestURI());
// String getQueryString():获取请求参数 username=42323&password=&hobby=1
System.out.println("getQueryString:"+request.getQueryString());
上面代码重点是:getMethod()、getContextPath()
请求头
// String getHeader(String name):通过请求头的名字得到请求头的值
// 获取请求头:user-agent: 浏览器的版本信息
System.out.println("User-Agent:"+request.getHeader("User-Agent"));
请求体
// 浏览器输入地址都是get请求,目前只有form表单才能进行post请求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("POST");
// 获取 post 请求体
// 1.获取字符输入流
BufferedReader reader = request.getReader();
// 2.读取数据(获得post请求体)
String str = reader.readLine();//读取一行
System.out.println("str = " + str);
}
}
通用方式获取请求参数
该方式能更方便的获取请求的参数值!
// 演示Request通用方式获取请求参数
// 浏览器访问: /req3.html
@WebServlet("/req03")
public class RequestDemo03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 我们可以在doPost中直接调用doGet
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.Map<String, String[]> getParameterMap():获取所有参数Map集合
Map<String, String[]> map = request.getParameterMap();
map.forEach((k,v)->{
System.out.println(k+"::"+Arrays.toString(v));
});
System.out.println("--------------------------------------");
// 2.String getParameter(String name):根据名称获取参数值(单个值)
String username = request.getParameter("username");
System.out.println("username = " + username);
String password = request.getParameter("password");
System.out.println("password = " + password);
System.out.println("--------------------------------------");
// 3.String[] getParameterValues(String name) :根据名称获取参数值(数组)
String[] hobbies = request.getParameterValues("hobby");
System.out.println("Arrays hobbies = " + Arrays.toString(hobbies));
}
}
Request解决POST请求参数中文乱码问题
_//解决POST请求参数乱码问题(注意;必须要放在获取请求参数前设置编码)
_request.setCharacterEncoding(“UTF-8”);
请求转发
请求转发(forward):一种在服务器内部的资源跳转方式。
在请求页面中编辑:
在转发页面中编辑:
请求转发特点:
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器的内部资源
3.一次请求,可以在转发的资源间使用request共享数据
使用 response对象来设置响应数据
Response 完成重定向
// 演示Response设置响应数据功能
// 浏览器访问: /resp01
@WebServlet("/resp01")
public class ResponseDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp01....");
// 重定向,方法一
// 1.设置响应状态码 302
response.setStatus(302);//我不行
// 2.设置响应头 Location
response.setHeader("Location","resp02");//你找他
// 简化方式完成重定向, 资源路径可以直接写: "resp02" 方法二
response.sendRedirect("resp02");
}
}
重定向特点:
浏览器地址栏路径发生变化;
可以重定向到任意位置的资源(服务器内部、外部均可);
两次请求,不能在多个资源使用request共享数据。
路径问题
Response 响应字符数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 0.设置响应编码,本质是设置了响应头;设置打印流的编码为UTF-8;告诉浏览我们的响应的是html网页,编码是UTF-8
response.setContentType("text/html;charset=utf-8");
// 1.获取字符输出流
PrintWriter writer = response.getWriter();
// 2.写数据到流中
writer.write("<h1>来自服务器的问题</h1>");
// 细节:流不需要关闭, Web服务器会处理
}
}
注意:
•该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
•中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1,
Response 响应字节数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.读取文件
// 获取资源在Tomcat中的路径 Web项目写资源路径以webapp作为参照
String realPath = request.getServletContext().getRealPath("imgs/Desert.jpg");
System.out.println("realPath = " + realPath);
FileInputStream fis = new FileInputStream(realPath);
// 2.获取response字节输出流
ServletOutputStream out = response.getOutputStream();
// 3.完成流的copy
/*byte[] buf=new byte[1024*8];
int len;
while((len=fis.read(buf))!=-1){
out.write(buf,0,len);
}*///这种方式可以用commons io中的IOUtils.copy方法代替,如下
IOUtils.copy(fis,out);
// 4.关闭
fis.close();
}
综合案例
用户登录
效果:
思路如下:
流程说明:
1.用户填写用户名密码,提交到 LoginServlet;
2.在 LoginServlet中使用 MyBatis查询数据库,验证用户名密码是否正确;
如果正确,响应“登录成功”,如果错误,响应“登录失败”。
具体步骤如下:(还需要MyBatis环境和MySQL的数据)
用户注册
流程说明:
1.用户填写用户名、密码等信息,点击注册按钮,提交到 RegisterServlet;
2.在 RegisterServlet中使用 MyBatis 保存数据;保存前,需要判断用户名是否已经存在:根据用户名查询 数据库。
具体步骤如下: