一、开发工具idea
二、创建简单的Java项目
三、WEB-INF 是安全目录,它之外的文件、目录tomcat启动后就可以通过url访问
四、初识servlet
servlet 是一个web小程序
1.servlet创建方法①
package cn.luochao.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 implements Servlet {
// 最好不要在servlet中定义变量
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init:默认情况下第一次访问时创建");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("config");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse,servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public String getServletInfo() {
System.out.println("info");
return null;
}
@Override
public void destroy() {
System.out.println("destory");
}
}
<!--路由映射-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.luochao.web.servlet.ServletDemo1</servlet-class>
<!--<load-on-startup>-1</load-on-startup>--><!--默认为负数第一次访问时init-->
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
2.创建servlet路由方法②继承GenericServlet
package cn.luochao.web.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
**@WebServlet("/demo2")** // 代替了web.xml中的路由映射
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("GenericServlet正常");
}
}
**3.创建servlet路由方法③继承HttpServlet(推荐)
package cn.luochao.web.servlet;
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;
**@WebServlet({"/demo3","/dd3","/ddd3","/uuuu/dddd4"})** // ==一个servlet可以通过WebServlet定义多个路由,层目录等==
public class SevletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet..........");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost.................");
}
}
五 Request和Response
这两个对象由服务器(tomcat等)创建的
(一) Request对象用来获取请求消息
HttpServletRequest
- 常用的获取请求行数据的方法
GET /demo/demo01?name=zhangsan
String method = req.getMethod(); // 获取请求方式
String path = req.getContextPath(); // 获取路径
String uri = req.getRequestURI(); // 获取ur
StringBuffer url = req.getRequestURL(); // url
String param = req.getQueryString(); // 获取参数
String username = req.getParameter("username"); // 获取参数
String version = req.getProtocol(); // 获取协议及版本
String user = req.getRemoteUser(); // 获取远程信息
String addr = req.getRemoteAddr(); // 获取远程信息
String ip = req.getRemoteHost(); // 获取远程信息
String agent = req.getHeader("user-agent"); // 获取请求头
int port = req.getRemotePort(); // 获取远程信息
System.out.println("doGet..........");
// 获取所有请求头
Enumeration<String> heardersNames = req.getHeaderNames();
while (heardersNames.hasMoreElements()){
String name = heardersNames.nextElement();
System.out.println(name + " ========> " +req.getHeader(name));
}
resp.getWriter().write("do something!");
- POST请求体获取
BufferedReader br = req.getReader();
String line = null;
while(line == br.readLine()){
System.out.println(line);
}
- 获取请求参数的通用方法(4种)
String username = req.getParameter("username"); // 获取参数方法1
String[] username = req.getParameterValues("username"); // 获取方法2
Enumeration<String> heardersNames = req.getHeaderNames();
while (heardersNames.hasMoreElements()){
String name = heardersNames.nextElement();
System.out.println(name + " ========> " +req.getHeader(name));
}
Map<String, String[]> paramMap = req.getParameterMap();
- 请求转发
一种在服务器内部进行的资源跳转,如转发到servlet3
req.getRequestDispatcher("/demo3").forward(req, resp);
特点:
在服务器内部执行,url地址栏不变,服务端使用
只能转发到当前服务器内部资源,
一次请求 - 共享数据
域对象:一个有作用范围的对象,可以在一定范围内共享对象
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。
req.setAttribute(String name, Object obj)
req.removeAttribute(String name, Object obj)
Object obj = req.getAttribute(name) - 获取servletContext
- 乱码解决
req.setCharacterEncoding(“utf-8”); // 解决乱码
使用beanutils来实现Java实体与map集合的互转,或者对象的操作
(二)Response对象用来设置响应消息
HttpServletResponse 设置响应行,头,体等
进行重定向:资源跳转的一种方式,
-
客户端使用
重定向:302
response.setRedirect("/demo4")
重定向地址栏变化(路由变化,数据不能共享),两次请求,可以访问其他网站 -
转发是在服务器内部使用资源,不需要虚拟路径
-
重定向是在servlet间跳转需要,虚拟路径,但是虚拟路径会改变,所以要动态获取拼接 String contextPath = req.getContextPath()
(三)ServletContext对象
request.getServletContext()
(四)会话技术
一次会话中包含多次请求和响应:浏览器第一次给服务器发送请求,会话建立,直到有一方断开会话,会话销毁
- 多次请求间共享数据
1.客户端会话技术cookie
2.服务端会话技术session
- 获取session对象
*写入session
3 == JSP入门学习 ==
指令:
- page
- include
- taglib
- 内置对象
在jsp页面不需要创建,直接使用的对象!
4.MVC
5.El表达式
6.JSTL标签
(五) web.xml的filter过滤器
当访问web服务器时,filter拦截请求,完成一些通用的特殊的功能,比如:登录验证、编码设置等、敏感词汇验证。
过滤器快速入门
2.代码
package cn.luochao.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") // 意思访问所有的资源之前都会拦截过滤
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被执行了。。。。。。。。");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
3.过滤器细节
配置:方式一
拦截方式的配置
方式二
@WebFilter("/*") // 意思访问所有的资源之前都会拦截过滤
- Filter生命周期
package cn.luochao.web.filter;
import javax.servlet.*;
import java.io.IOException;
public class FilterDemo3 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 服务器启动时执行, 用于加载资源
System.out.println("init filterDemo3。。。。。。。。。。。");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 对req处理
System.out.println("filterDemo3被执行了。。。。。。。。");
//放行
filterChain.doFilter(servletRequest, servletResponse);
// 对rep处理
System.out.println("filterDemo3回来了了。。。。。。。。");
}
@Override
public void destroy() {
// 服务器停止时执行,用来释放资源
System.out.println("destroy filterDemo3。。。。。。。。。。。");
}
}
== 多个过滤器执行==
- 登录验证
- 敏感词汇过滤
使用装饰设计模式(动态代理增强方法功能)
(六) web.xml的listener监听器
web的三大组件之一
事件监听机制
ContextLoaderListener 监听servlet的创建和销毁
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>