Servelet
一、Servelet是什么?
Servlet是开发动态web的一门技术
是API中的一个接口,是实现了Servlet的Java程序
二、使用步骤
1.编写一个Servlet程序
1、在java资源包下新建servlet包
2、在该包下新建类并让该类继承HttpServlet
3、重写doGet()、doPost()方法
4、给新建的类实现servlet映射
或者对着包名右键new Servlet即可自动创建(注意要取消掉Create Java EE 6 annotated class的勾选)
2.编写Servlet映射
因为我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以需要在web服务中注册我们写的Servlet,还需给他一一个浏览器能够访问的路径(在web.xml中添加)
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.veterlemon.servlet.HelloServlet</servlet-class>
</servlet>
<!--一个servlet对应一个mapping:映射-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!--映射的请求路径: http://ip:port/工程路径/hello-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.配置tomcat
见Maven设置篇
https://blog.csdn.net/weixin_42431775/article/details/122872077
4.防止中文乱码
设置客户端和服务器的编码格式
//doGet()或doPost()方法中加入
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
5.启动测试
三、Servlet的继承关系
四、Servlet访问原理
浏览器发送请求至web容器并访问Servlet,调用service方法通过request拿到请求、response响应请求,最后返回至web容器从而响应客户端
一个Servlet可以指定多个通用映射路径(servlet-mapping)
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
五、原始继承了Servlet类的写法
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
//构造器
public HelloServlet() { System.out.println("1"); }
@Override
public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2"); }
@Override
public ServletConfig getServletConfig() { return null; }
//处理请求和响应
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//分发请求
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
if ("GET".equals(method))
doGet();
else if("POST".equals(method))
doPost();
}
//分发请求处理:GET
public void doPost(){ System.out.println("get请求"); }
//分发请求处理:POST
public void doGet(){ System.out.println("post请求"); }
@Override
public String getServletInfo() { return null; }
@Override
public void destroy() { System.out.println("4"); }
}
1.ServletConfig类
是servlet程序的配置信息类(Servlet程序和ServletConfig由Tomcat创建),作用:
1、可以获取Servlet程序的别名servlet-name的值
//init方法内
System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName());
2、获取初始化参数init-param(得现在web.xml的servlet标签中配置init-param)
//web.xml中
<!--init-param是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
//init方法内
System.out.println("初始化参数username的值是:" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数value的值是:" + servletConfig.getInitParameter("value"));
3、获取ServletContext对象
//init方法内
//获取ServletContext对象
System.out.println(servletConfig.getServletContext());
2.ServletContext类
ServletContext是一个接口,代表servlet上下文对象(域对象,一个web项目共用一个对象),作用:
域对象:是可以像Map一样存取数据的对象(域指的是存取数据的操作范围)
存数据,取数据,删除数据
setAttribute(),getAttribute(),removeAttribute()
1、获取web.xml中配置的上下文参数context-param
//web.xml文件中配置context-param
<!--上下文参数,可多组-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
//方法中
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("context-param参数的name属性值是:" + username);
System.out.println("context-param参数的value属性值是:" + context.getInitParameter("password"));
2、获取当前的工程路径,格式:/工程路径
ServletContext servletContext = getServletConfig().getServletContext();
System.out.println("当前工程路径为:" + servletContext.getContextPath());
3、获取工程部署后在服务器硬盘上的绝对路径
ServletContext servletContext = getServletConfig().getServletContext();
//工程下web目录所在的绝对路径
System.out.println("工程部署的绝对径为:" + servletContext.getRealPath("/"));
//工程下web目录下的css目录所在的绝对路径
System.out.println("工程部署的绝对径为:" + servletContext.getRealPath("/css"));
4、像Map一样存取数据
ServletContext servletContext = getServletConfig().getServletContext();
servletContext.setAttribute("key", "value");
System.out.println("context中获取域数据key的值是:" + servletContext.getAttribute("key"));
六、HttpServletRequest类
通过HttpServletRequest对象,可以获取所有请求信息
1.常用方法:
//获取请求的统一资源定位符(绝对路径)
System.out.println("URI=" + request.getRequestURI());
//获取客户端的ip地址
System.out.println("URL=" + request.getRequestURL());
//获取请求头
System.out.println("客户ip=" + request.getRemoteHost());
//获取请求的参数
System.out.println("请求头的User-Agent" + request.getHeader("User-Agent"));
//获取请求的方式GET或POST
System.out.println("请求的方式" + request.getMethod());
//获取请求的参数(多个值的时候使用)
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("获取请求的参数-用户名:" + username +
",获取请求的参数-密码:" + password + ",获取 请求的参数-爱好:" + Arrays.asList(hobby));
2.请求转发的实现
本质上是一次HTTP请求(相当于请求的递归)
浏览器的地址不变,Servlet_01和Servlet_02共享Request域的数据
//Servlet_01类
//获取请求参数
String username = request.getParameter("username");
System.out.println("在servlet1中查看参数:" + username);
//设置域值
request.setAttribute("key", "柜台1的章");
//转发,转发的地址为servlet-mapping的url-pattern
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet_02");
requestDispatcher.forward(request, response);
//Servlet_02类
//获取请求参数
String username = request.getParameter("username");
System.out.println("在servlet2中查看参数:" + username);
//查看servlet1是否有”盖章“
Object key = request.getAttribute("key");
System.out.println("servlet1是否有“盖章”:" + key);
//处理自己的业务
System.out.println("servlet2的业务");
七、HttpServletResponse类
通过HttpServletResponse对象,可以设置响应信息
1.通过HttpServletResponse对象设置响应
2.通过输出流将响应回传
字节流:getOutputStream(),常用于下载(传递二进制数据)
字符流:getWriter(),常用于回传字符串(最常用)
二者只能用其一
//防止乱码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
//往客户端回传数据
PrintWriter writer = response.getWriter();
writer.write("这是回传的数据");
3.请求重定向
服务器端在响应客户端第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。本质上是两次HTTP请求(相当于请求的迭代),对应两个request对象
//response_01的代码
//请求重定向形式一
System.out.println("resopnse01");
//设置响应状态:302请求重定向
response.setStatus(302);
//设置响应头,说明新地址
response.setHeader("Location", "http://localhost:8080/javaWeb_myDemo/response_02");
//请求重定向形式二(推荐)
response.sendRedirect("http://localhost:8080/javaWeb_myDemo/response_02");
//response_02的代码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("response2的结果");