目录
1,Helloservlet
2,Servlet运行原理
3,servlet的mapping问题
4,ServletContext对象与应用
5,获取初始化参数
6,请求转发
7,读取资源文件
简介:
Servlet就是sun公司开发动态web的技术
sun公司在这些api中提供一个接口叫做Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现servlet接口
- 把开发好的java类部署到web服务器
把实现了接口的java程序叫做servlet
一,HelloServlet
在这里,我们使用父子工程来创建项目:
1,构建一个普通的Maven项目,删掉里面的src目录,这个空的工程就是maven的主工程。对着这个项目右键新建一个modul创建子工程。
介绍一下里面的四个文件:
pom.xml:maven的核心配置文件
.iml:是idea的识别文件
.idea:idea的配置文件
2,关于maven的父子工程理解
父工程中会有:
子项目中会有:
3,父项目中的jar包子项目可以直接使用,
son extends father。
创建好过后,我们无论在什么项目中,maven都要放一个过滤器:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
4,放入依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
5,编写一个Servlet程序
编写一个普通类
实现Servlet接口(Servlet接口sun公司有两个默认的实现类,HttpServlet和GenericServlet),这里我们直接继承HttpServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get into doGet method");
//ServletOutputStream outputStream = resp.getOutputSteam()
PrintWriter writer = resp.getWriter();//向外面写东西,响应流
writer.print("hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6,编写Servlet映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器注册写的Servlet,还需要一个浏览器能够访问的路径
<?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.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
7,配置tomcat
转链接:配置tomcat的两种方式:点击跳转
启动:
地址输入hello
二, Servlet运行原理
servlet是由web服务器调用,web服务器再接受浏览器请求后,会
(web容器指tomcat’服务器)
servlet的mapping问题
1,一个servlet可以指定一个映射路径
2,一个servlet可以指定多个映射路径
3,一个servlet可以指定通用映射路径
4,默认请求路径
5,指定一些后缀或前缀等等。。。。
指定后缀
6,优先级问题
指定了固定的映射路径优先级最高,找不到的去默认的/*处理请求
public class Errorpage extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("页面出错");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<!--localhost://8080/Servlet_1_war -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.zaozao</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>erropage</servlet-name>
<servlet-class>com.servlet.Errorpage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>erropage</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
三,ServletContext对象
在父级项目中新建一个子类项目
得到一个项目web项目的目录,这里缺少。java和resources目录,创建文件夹与标记颜色
得到:
将web.xml文件的文件头拿过来
第二步:
<servlet>
<servlet-name>ServletContext</servlet-name>
<servlet-class>com.ServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
public class ServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
}
}
修改为当前module
访问hello,由于response没有响应,什么都没有,后台打印
3.1ServletContext
web容器在启动的时候,它会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用
- 共享数据(我在这个Servlet中保存的数据,可以在另一个servlet中拿到)
class ServletContext
public class ServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this,调用自身这个类
//this.getInitParameter() 初始化参数
//this.getServletConfig() Servlet配置
//this.getServletContext() 上下文
javax.servlet.ServletContext servletContext = this.getServletContext();
String username ="小明";
servletContext.setAttribute("username",username);//将一个数据保存在了ServletContext中
System.out.println("hello");
}
}
class GetServlet
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String attribute = (String)servletContext.getAttribute("username");
//数据放在上面,响应放在下面
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+attribute);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
web.xml中写
<servlet>
<servlet-name>GetContxt</servlet-name>
<servlet-class>com.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetContxt</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
先输入hello路径存入数据,再输入getc,取出数据
3.2ServletContext应用
idea的结构体
标记为过时
3.2.1获取初始化参数
在web.xml中配置
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>ServletParam</servlet-name>
<servlet-class>com.ServletParam</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletParam</servlet-name>
<url-pattern>/pg</url-pattern>
</servlet-mapping>
class ServletParam
public class ServletParam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
3.3.2请求转发
request的转发链接,输入req的地址得到gp的内容
public class ServletRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了这个方法");
ServletContext servletContext = this.getServletContext();
//RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/pg");//转发的请求路径
//requestDispatcher.forward(req,resp);//调用forward实现请求转发
servletContext.getRequestDispatcher("/pg").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
<servlet>
<servlet-name>servletRequest</servlet-name>
<servlet-class>com.ServletRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletRequest</servlet-name>
<url-pattern>/req</url-pattern>
</servlet-mapping>
3.3.3读取资源文件
properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现,都被打包到了同一个路径下:classes,在当前web项目下。
public class PropertiesServlet extends HttpServlet {
//用流读取配置文件内容
@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);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
web.xml
<servlet>
<servlet-name>dbtest</servlet-name>
<servlet-class>com.PropertiesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dbtest</servlet-name>
<url-pattern>/db</url-pattern>
</servlet-mapping>