目录
maven视图module名为灰白色且TomCat没有02_servlelt的war包问题的解决方式
2.利用ServletContext存取数据的简单使用(共享数据)
1. 若在java文件夹中新建了properties文件没有在target中生成对应的文件,需要在pom.xml中如下设置:
2.context.getResourceAsStream("/WEB-INF/classes/db.properties")中的地址是target中的classespath的类地址
一、学习前准备
1.在之前的项目maven-01-servlet中新建一个module:02_servlet
2.完善目录结构:在main下新建一个java文件夹和resources文件夹并分别标记为Sources Root和Resources Root。
3.将pom.xml变为最干净的样子
4.新建包并创建一个HelloServlet类继承HttpServlet类,并简单重写doGet()方法以便学习
5.在web.xml中注册该servlet
6.配置TomCat
7.运行测试
二、项目中创建module后遇到的问题解决
maven视图module名为灰白色且TomCat没有02_servlelt的war包问题的解决方式
1.遇到问题的截图:
2.解决方式:
file-->settings搜索maven,选择ignored Files,可以看到02_servlet的pom.xml文件是被选中的,点击取消选中即可。
3.解决后:
三、ServletContext对象及其应用
1.ServletContext是什么?
ServletContext凌驾于所有Servlet之上,它可以用来保存一些数据,该项目中的所有Servlet都可以去获取这些数据
2.利用ServletContext存取数据的简单使用(共享数据)
①.在HelloServlet中获取ServletContext对象并用其来保存一些数据
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用getServletContext()方法获取ServletContext对象
ServletContext context = this.getServletContext();
//自定义一个字符串数据
String str = "JavaWeb学习";
//使用context调用setAttribute()方法保存数据
context.setAttribute("str",str);
}
}
②.新建一个GetServlet程序去获取保存的数据
GetServlet.java:
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = this.getServletContext();
//利用getAttribute()方法获取数据
String str = (String) context.getAttribute("str");
//设置响应体的内容
resp.setContentType("text/html");
//设置响应的字符集为utf-8
resp.setCharacterEncoding("utf-8");
//打印数据
resp.getWriter().println(str);
}
}
web.xml:
<!--注册HelloServlet-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
<!--注册GetServlet-->
<servlet>
<servlet-name>GetServlet</servlet-name>
<servlet-class>com.kuang.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetServlet</servlet-name>
<url-pattern>/getServlet</url-pattern>
</servlet-mapping>
③.获取数据结果
注意:要获取数据必须要先保存数据,因此要先访问HelloServlet程序保存了数据再访问GetServlet程序才能获取数据
3.获取初始化参数
ServletContext的setInitParameter()可以设置一些初始化参数,通过getIninParameter()方法去获取。并且getInitParameter()不仅可以获取通过setInitParameter()设置的参数还可以获取web.xml中设置的初始化参数。
①.在web.xml中设置初始化参数
<context-param>
<param-name>name</param-name>
<param-value>kuangstudy.com</param-value>
</context-param>
③.在GetServlet中去获取初始化参数
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = this.getServletContext();
//获取web.xml中的初始化参数
String url = context.getInitParameter("url");
//设置响应体的内容
resp.setContentType("text/html");
//设置响应的字符集为utf-8
resp.setCharacterEncoding("utf-8");
//打印数据
resp.getWriter().println("web.xml中:" + url);
}
}
④.获取结果
注意:上下文初始化后无法设置初始化参数
4.请求转发
1.原理:A要去请求C的资源时,B去请求得到C的资源并转发给A,这个过程地址不会改变
2.简单应用
①.新建两个Servlet:ServletDemo1和ServletDemo2,并分别为其注册映射地址。
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.kuang.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>com.kuang.servlet.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>
②.分别在ServletDemo1和ServletDemo2中打印不同的话,在ServletDemo1中请求转发到ServletDemo2,观察打印的是什么。
ServletDemo1.java:
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str = "ServletDemo1页面";
//设置响应体的内容
resp.setContentType("text/html");
//设置响应的字符集为utf-8
resp.setCharacterEncoding("utf-8");
resp.getWriter().println(str);
ServletContext context = this.getServletContext();
//请求转发到ServletDemo2
context.getRequestDispatcher("/servletDemo2").forward(req,resp);
}
}
ServletDemo2.java:
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str = "ServletDemo2页面";
//设置响应体的内容
resp.setContentType("text/html");
//设置响应的字符集为utf-8
resp.setCharacterEncoding("utf-8");
resp.getWriter().println(str);
}
}
运行结果:
5.读取资源文件
①.新建一个db.properties文件并输入一些内容
②.新建一个ServletDemo3去读取db.properties文件
ServletDemo3.java:
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//这里的地址是classespath类地址(在target中)
InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().println(username + ":" + password);
}
}
web.xml:
<servlet>
<servlet-name>ServletDemo3</servlet-name>
<servlet-class>com.kuang.servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo3</servlet-name>
<url-pattern>/servletDemo3</url-pattern>
</servlet-mapping>
③.读取结果
四、遇到的问题解决方法
1. 若在java文件夹中新建了properties文件没有在target中生成对应的文件,需要在pom.xml中如下设置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2.context.getResourceAsStream("/WEB-INF/classes/db.properties")中的地址是target中的classespath的类地址