Servlet
Servlet
Servlet简介
-
Servlet是sun公司开发的动态web的一门技术
-
sun在这些API中提供一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现servlet接口
- 把开发好的Java类部署到web服务器
把实现了Servlet接口的Java程序叫做Servlet
HelloServlet
Servlet接口有两个默认实现类HttpServlet,
-
构建一个普通Maven项目,删掉其中原有的src文件夹,通过moudel构建以后的学习所用的项目;这个空的工程就是以后的主工程
-
关于Maven父子工程的理解
父项目中会有
<modules>
<module>servlet</module>
</modules>
父项目中的jar包子项目可以使用,反过来父项目不能使用子项目的jar包
-
将web.xml中的版本换成最新的
-
完善项目结构
- java
- resources
-
编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,继承HttpServlet
public class HelloServlet extends HttpServlet{ // 由于get和post只是请求是实现的不同实现方式,可以互相调用,业务逻辑一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); // 响应流 writer.print("hello,servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
- 为什么需要映射:我们写的是Java程序,但是需要通过浏览器进行访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器可以访问的地址
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.cnpolairs.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
配置tomcat
注意:配置项目发布的路径
- 启动测试
Servlet原理
Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会
Mapping问题
- 一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> <servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
- 一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 指定一些后缀或者前缀等
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.cnpolaris</url-pattern>
</servlet-mapping>
-
优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的请求路径
<!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.cnpolairs.ErrorServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
ServletContext
web容器在启动的时候,他会为每个web程序都创建一个对应的Servlet对象,它代表了当前的web应用;
共享数据
在一个Servlet中的数据,可以在另一个Servlet中访问
存数据
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter() // 初始化参数
// this.getServletConfig() // Servlet配置
// this.getServletContext() // Servlet上下文
ServletContext context = this.getServletContext();
String username = "CNPolaris";
context.setAttribute("username",username); //将一个数据保存在ServletContext中,名字为username 值为username
System.out.println("hello,servlet");
}
}
取数据
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 测试取出servlet中的数据
ServletContext context = this.getServletContext();
String username = String.valueOf(context.getAttribute("username"));
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println(username);
}
}
配置
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.cnpolaris.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getname</servlet-name>
<servlet-class>com.cnpolaris.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getname</servlet-name>
<url-pattern>/getname</url-pattern>
</servlet-mapping>
测试访问
获取初始化参数
<!--配置一些初始化参数-->
<context-param>
<param-name>URL</param-name>
<param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("URL");
resp.getWriter().print(url);
}
请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了demo04");
// RequestDispatcher requestDispatcher = context.getRequestDispatcher("/get"); //转发的请求路径
// requestDispatcher.forward(req,resp); //调用forward实现请求转发
context.getRequestDispatcher("/get").forward(req,resp);
}
读取资源文件
Properties
- 在Java目录下新建Properties
- 在resources目录下新建Properties
发现:都被打包到一个同一路径下:classes 俗称这个路径为classpath
思路:需要一个文件流
username=root
password=123
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().print(username+":"+password);
}