Servlet详解
概述:sun公司开发动态web的一门技术,在这些API中提供了个接口叫Servlet ,开发一个Servlet程序只需要编写接口的实现类,并部署到web服务器中。
Servlet配置步骤
-
构建一个普通maven项目,删掉src包,作为maven主工程。在pom.xml 中添加servlet,jsp 的依赖。直接网上搜maven repository ,在里面根据关键字搜索,找个靠谱的把代码粘贴到新建的<dependencies> 标签里,报红线点开maven右边栏刷新下载即可,如 <dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<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 {
@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-name>hello</servlet-name>
<servlet-class>com.Yong.servlet.HelloServelt</servlet-class>
</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() (有中文字符时使用,可能造成字符串丢失),还有对应的向浏览器发送响应头,响应状态码的方法 -
下载文件
String realPath = "D:\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\1.jpg";
String filename = realPath.substring(realPath.lastIndexOf("\\")+1);
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Content-Disposition","attachment;filename="+filename);
FileInputStream is = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
ServletOutputStream os = resp.getOutputStream();
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
is.close();
os.close();
HttpServletRequest
与Response相对,有许多get开头的方法可以获取前端参数信息,还主要应用于请求转发。
页面跳转
-
重定向(302) 一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL会改变。resp.sendRedirect("/项目路径/其他servlet地址") -
请求转发(307) 一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。 req.getRequestDispatcher("/其他servlet地址").forward(req,resp);
|