Servlet详解
概述:sun公司开发动态web的一门技术,在这些API中提供了个接口叫Servlet
,开发一个Servlet程序只需要编写接口的实现类,并部署到web服务器中。
Servlet配置步骤
-
构建一个普通maven项目,删掉src包,作为maven主工程。在
pom.xml
中添加servlet,jsp
的依赖。直接网上搜maven repository
,在里面根据关键字搜索,找个靠谱的把代码粘贴到新建的<dependencies>
标签里,报红线点开maven右边栏刷新下载即可,如<dependencies> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> </dependencies>
-
在主项目里创建子Moudel,点上小对勾,选中
maven-...-webapp
,再给子项目起名,然后查看目录、配置文件、仓库的路径对不对(可能会默认在C盘新建),子工程就建好了。主项目的
pom.xml
文件中会有<modules>
标签,子项目会自动继承,相当于有<parent>
标签,主项目中的jar包子项目可以直接使用 -
maven环境优化,修改
web.xml
为最新版本<?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"> </web-app>
再讲maven结构搭建完整,在
main
目录下补java
目录和resources
-
编写
Servlet
程序,即创建实现类继承HttpServlet
(一个Servlet的半实现类),重写主要方法public class HelloServelt extends HttpServlet { //get和post只是请求实现的不同方式,业务逻辑一样,可以互相调用 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter();//响应流 writer.println("Hello,servlet!!!");//页面显示 System.out.println("进入doGet");//控制台打印 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
注册及编写
servlet
的映射(在web.xml
中)因为Java程序要通过浏览器访问,浏览器连接web服务器,所以我们需要在web服务器中注册写的
servlet
,提供一个访问路径<!--注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.Yong.servlet.HelloServelt</servlet-class> </servlet> <!--servlet的请求路径,注意前面加“/”--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/Hello</url-pattern> </servlet-mapping>
-
配置tomcat
点击工具栏的run,
Edit Configurations
,点加号,选small tomcat
,修改name为Tomcat 9
(好看而已),根据需求看是否要该项目路径,默认为子项目名,apply
再ok
-
启动测试,
localhost:8080/项目路径/servlet请求路径
,会生成一个target
包
Ps:Mapping问题
一个servlet可以指定一个映射路径(如上文),也可以指定多个路径,通用路径,指定后缀前缀(*.)等,只写/*
为默认路径。但指定的固有映射路径优先级最高,找不到才回去走默认路径。
Servlet运行原理
ServletContext
概述:web容器在启动时,会为每一个web程序创建一个对应的ServletContext对象,来代表当前的web应用。常用于共享和保存数据。主要功能有:
- 可通过
对象.setAttribute(属性,值对象)
设置属性并赋值(类似于键值对),同一个包下其他servlet程序通过this.getServletContext()
获取该对象,再调用getAttribute(属性)
取值,需要强制转型。 - 获取初始化参数:先在
web.xml
中添加参数标签,再调用getInitParameter()
- 请求转发:
getRequestDispatcher("/请求路径").forward(req,reps)
,相当于自己访问不到委托别人去访问,但还是自己的路径不变。 - 读取资源文件
properties
:getResourceAsStream("/资源路径")
,再new Properties().load(流对象)
下载流,prop.getProperty(资源文件里的属性)
取值。
HttpServletResponse
背景:服务器在接到浏览器得http请求后,会分别创建HttpServletResponse和HttpServletRequest对象,用于存放响应信息和请求参数。
常见应用:
-
向浏览器输出消息
getOutputStream()
、getWriter()
(有中文字符时使用,可能造成字符串丢失),还有对应的向浏览器发送响应头,响应状态码的方法 -
下载文件
//1. 获取要下载文件的路径 String realPath = "D:\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\1.jpg"; //2. 获取下载的文件名,通过路径最后一个”/“后的字符串,第一个”/“是转义字符 String filename = realPath.substring(realPath.lastIndexOf("\\")+1); //3. 设置让浏览器支持下载,搜索下载文件的消息头头格式(响应的配置信息,包含附件) resp.setContentType("text/html;charset=UTF-8");//浏览器根据该类型来指定程序解析对应类型的文件 resp.setHeader("Content-Disposition","attachment;filename="+filename); //4. 获取下载文件的输入流 FileInputStream is = new FileInputStream(realPath); //5. 创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; //6. 获取OutputStream输出流对象 ServletOutputStream os = resp.getOutputStream(); //7. 将输入流写入缓冲区,使用输出流将缓冲区中的数据送到客户端 while ((len = is.read(buffer)) != -1){ os.write(buffer,0,len); } is.close();//释放资源 os.close(); //注册servlet并编写映射 //配置tomcat,把deployment目录设置为当前子项目的webapp
HttpServletRequest
与Response相对,有许多get开头的方法可以获取前端参数信息,还主要应用于请求转发。
页面跳转
-
重定向(302)
一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL会改变。
resp.sendRedirect("/项目路径/其他servlet地址")
-
请求转发(307)
一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。
req.getRequestDispatcher("/其他servlet地址").forward(req,resp);