编写第一个servlet程序
1、创建一个普通的maven项目
2、删掉src目录
3、在pom.xml中添加依赖
<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-->
<scope>provided</scope>
</dependency>
</dependencies>
这里报红的话点击一下右边的刷新,下载依赖
4、新建maven 的web子模块
报错了…
不知道咋回事,把项目删了,重弄一次就好了
又遇到bug,没有parent标签。这里手动添加,不然后面无法继承HttpServlet类
<parent>
<artifactId>FirstServlet</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
ctrl+o重写方法 Alt+Enter 导包
5、子模块添加Java目录和Resources资源目录,形成这样的工程结构
6、在Java目录下自定义包,并在包下创建类
package com.hl;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 {
//ServletOutputStream outputStream = resp.getOutputStream();
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello,Servlet!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
7、配置web.xml文件
由于我们写的只是Java类,但要通过浏览器访问,即需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径,因此需要在web.xml中配置路径,请求地址映射。注册一个Servlet类,web.xml中就需要两个标签去映射表示,即与,它们是成对出现的
下面我用“hello”作为浏览器映射请求的路径,其中在标签下的表示自定义的路径请求映射,是对应的自定义Servlet类的位置;在下的与上面的要求是对应的,表示初始时默认访问的路径.
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hl.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern><!--斜杆不要漏-->
</servlet-mapping>
8、配置Tomcat
上述工作准备就绪后,启动我们是需要借助Tomcat服务器来帮我们去到浏览器。因此我们需要准备好相关的Tomcat工具来启动
9、启动Tomcat
ServletContext应用
1、共享数据
getServletContext 在这个Servlet中保存的数据,可以在另一个Servlet中拿到
1、新建子模块servlet_02
使用servlet框架,补全maven项目,添加java和resources。看子模块servlet_02的pom.xml有没有parent标签,没有的话手动补齐
<parent>
<artifactId>FirstServlet</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
2、建包,创建HelloServlet类
3、到web.xml下注册servlet
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hl.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4、配置Tomcat
删除servlet_01,添加servlet_02
5、启动Tomcat
6、编写HelloServlet
```java
package com.hl.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter(); 初始化参数
//this.getServletConfig(); Servlet配置
ServletContext context= this.getServletContext();//Servlet上下文
String username = "HL";
context.setAttribute("username",username); //将一个数据保存在了ServletContext中
System.out.println("hello " + username);
System.out.println("Hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
```
7、编写GetServlet
package com.hl.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().print("名字:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
8、注册GetServlet
<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">
<display-name>Archetype Created Web Application</display-name>
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hl.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.hl.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
</web-app>
9、运行Tomcat,/hello,/getc
2、初始化参数
getInitParameter获取初始化参数
除了可以获取getInitParameter里面的参数,还可以获取web.xml里面的context-param
1、在web.xml添加以下代码
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<!--JDBC链接数据库的url-->
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
2、demo3
package com.hl.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
response.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
3、在web.xml中注册
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.hl.servlet.demo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
4、启动Tomcat
3、请求转发
RequestDispatcher 请求转发
1、demo4
package com.hl.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class demo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//获得请求转发,转发的请求路径
requestDispatcher.forward(req,resp); //调用forward实现请求转发
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
2、注册web.xml
<servlet>
<servlet-name>sd4</servlet-name>
<servlet-class>com.hl.servlet.demo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd4</servlet-name>
<url-pattern>/sd4</url-pattern>
</servlet-mapping>
3、启动tomcat
由于请求转发,可以看到进入的是demo3中的/gp页面
注意区分请求转发和重定向!
4、读取资源文件
Properties
1、在resources目录下建一个db.properties
username=root
password=123456
2、运行maven的clean插件清除原来的target文件
3、重新启动Tomcat,发现被打包到了路径classes下,俗称为类路径classpath。
maven由于他的约定大于配置,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
<!--在build中配置resources,来防止我们的资源导出失败问题-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
5、编写demo5文件
package com.hl.servlet;
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.InputStream;
import java.util.Properties;
public class demo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//把资源变成流,因为我们的getproperties需要流
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6、注册demo5
<servlet>
<servlet-name>sd5</servlet-name>
<servlet-class>com.hl.servlet.demo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd5</servlet-name>
<url-pattern>/sd5</url-pattern>
</servlet-mapping>