JavaWeb基础二(Servlet)
介绍
- Servlet就是sun公司开发动态web的一门技术。
- Sun公司在这些API中提供了一个接口:Servlet,如果像开发Servlet程序,只需要完成两个步骤。
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中。
把实现了Servlet接口的Java程序叫做Servlet。
HelloServlet
Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet
1.构建一个普通的Maven项目。
2.删除src文件。此后学习内容存放在项目下。这个空工程就是Maven主工程。
3.导入Maven中Servlet的依赖。(可直接网上查找最新的)
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
4.创建子项目。
创建成功后,父项目中会自动生成
<modules>
<module>servlet001</module>
</modules>
注:父项目中的Java子项目可以直接使用。
5.建立java与resources文件,详细见javaweb基础一篇。详细结构如
6.编写一个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 {
super.doPost(req, resp);
}
}
7.编写Servlet的映射
为什么要映射:因为上方写的是Java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。
在web.xml文件中配置映射
8.配置Tomcat
详细见上一节。
9.启动测试
Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
Mappint问题
1.一个Servlet可以指定一个映射路径
<!--Servlet的请求路径-->
<!--localhost:8080/s2/hello-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5.指定一些后缀或者前缀等
添加后缀时,不能添加项目映射的路径,正确格式如下:
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
6.优先级问题
指定了固有的映射路径,优先级最高,如果找不到,就会走默认的请求。
ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletCotext对象,它代表了当前的web应用。
共享数据
- 在这个Servlet中保存的数据,可以在另外一个Servlet拿到数据。
- 1.需要放置数据的类
-
//存储数据 public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String username="张三"; context.setAttribute("username",username);//将数据保存在ServletContext中,(key,vlue),名字,值 } }
- 2.需要一个读取数据的类
-
//获取数据 public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext();//获取ServletContext对象 String username = (String) context.getAttribute("username");//获取建,得到object类型,强制转化为String类型 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);//在doPost里面调用doGet } }
- 3.以及配置web.xml文件
-
<!--配置两个文件的请求路径--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.serenity.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>getc</servlet-name> <servlet-class>com.serenity.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping>
测试结果:
-
获取初始化参数
1.在web.xml中配置初始化参数
2.使用,编写一个类
3.在web.xml中配置新文件的请求路径。
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.serenity.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
运行结果为:
请求转发
1.编写一个请求转发的类
2.配置web.xml文件(每次想要实现前端,都需要配置,后期不重复)
结果显示:
原理:A想要从B页面请求到C页面的内容,由B页面向C页面发生请求,收到C页面的响应后,由B页面响应给A页面。

读取资源文件
Properties类:
- 在Java目录下新建properties(需要在pom.xml中的build中配置resources,来防止我们资源导出失败的问题,具体代码可直接搜索)
- 在resources目录下新建properties
两个资源创建时不同路径,但都会被打包在同一个路径下(classes),该路径被称为classpath
1.建立资源:在resources目录下创建文件
2.创建类
3.在web做映射
4.清除数据,重新加载项目
结果显示: