目录
- Demo结构
- 源码分析
- 总结
Demo结构
源码分析
1.首先进入web.xml配置一下serlvet路由,也就是serlvet的name,class,以及对应的url-pattern
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zty.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.zty.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.zty.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>s4</servlet-name>
<servlet-class>com.zty.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s4</servlet-name>
<url-pattern>/s4</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>s5</servlet-name>
<servlet-class>com.zty.servlet.ServletDemo05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s5</servlet-name>
<url-pattern>/s5</url-pattern>
</servlet-mapping>
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
</web-app>
- 注意:web.xml还可以配置一些初始参数
2.进入HelloServlet里面
package com.zty.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//this.getInitParameter() 初始化参数
//this.getServletConfig() Servlet配置
//this.getServletContext() Servlet上下文
ServletContext context = this.getServletContext();
String username = "张天泳"; //数据
context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为:username 。值 username
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}
}
- 这个有什么作用呢,一进来,就通过ServletContext获取一个全局通用的属性username
- 进来发现空空如也。。。
3.去到getServlet对应的页面
package com.zty.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 注意,这里需要调整一下contenttype和encoding,后面可以用filter来做,同时来个getWriter来print结果,结果的获取就是this.getServlteContext即可
- 可以看到,确实拿到了名字
- 如果我们重新开一个浏览器,直接进来getc,也可以得到这个结果,因为它已经存在与服务器中了
4.从web.xml中获取初始配置参数
package com.zty.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
5.forward进行转发,注意,转发url不会变!他只是把req丢给另一个servlet处理了!
package com.zty.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
//requestDispatcher.forward(req,resp); //调用forward实现请求转发;
context.getRequestDispatcher("/s3").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
- 看到了吧,并没有两个请求之类的。。。
6.从.preperties中取属性
package com.zty.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 首先还是用this对象,取出getServletContext().getResourceAsStream,这里应该用到了反射,这里要注意properties在target中的位置:
- 这个本来在resources下的,在target中去到了/web-inf/classes下面了
- 这样就可以得到了一个inputStream
- 然后定义一个new Properties()
- prop.load一下inputStream即可
- 然后,prop.getProperty一下,返回结果
- 注意,.properties文件的写法:
总结
- servlet调用各种参数,以及全局参数的互通使用this.getServletContext()!