javaweb
狂神超厉害!!!
狂神说Java
1、 Serlvet
1.1、 servlet 简介
- servlet 就是sun公司开发动态web的一门技术
- sun在这些API中提供了一个接口叫做: Servlet
- 开发一个servlet程序 只需要:
- 编写一个类 实现接口
- 把开发好的java类 部署到web服务器
把实现servlet接口的java程序 叫做 servlet
1.2、 HelloServlet
servlet接口在sun公司有两个默认的实现类
-
构建一个maven,删掉里边的东西 src目录 在这里面 建立moudle 空的工程就是maven 的主工程
-
关于Maven 父子工程的理解:
父项目:
<modules> <module>servlet-01</module> </modules>
子项目中
<parent>
<!-- G
A
V
-->
</parent>
父项目中的java 子项目可以直接使用
3.maven 环境优化
- 更新web.xml 设置
- 将maven的结构搭建完整
4.编写一个Servlet程序
-
编写一个普通类
-
实现Servlet接口,这里直接HttpServlet
public class HelloServlet extends HttpServlet { // Get() Post()只是请求实现的不同方式, 可以相互调用 业务逻辑一致 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 响应流 PrintWriter writer = response.getWriter(); writer.println("Hello,Servlet"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
5.编写servlet的映射
为什么需要 映射: 我们写的是java程序,但是想要通过浏览器访问,而浏览器访问要连接到web服务器,所以我们需要在服务器中注册servlet,而且需要给浏览器一个能够访问的路径
<!-- 注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置tomcat
7.启动测试
1.3、 Servlet原理
1、 Servlet是由web服务器调用,web服务器在收到浏览器的请求之后,会:
1.4、 Mapping
-
一个servlet 可以指定一个路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个servlet 可以指定多个路径
<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> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping>
-
一个servlet 可以指定通用路径
默认路径 会干掉index.jsp(默认的主页)
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
应用:自定义设置出错界面
public class ErrorServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 一些初始的设置 resp.setCharacterEncoding("utf-8"); resp.setContentType("Text/html"); // 输出流 PrintWriter writer = resp.getWriter(); writer.println("<h1>404</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<servlet> <servlet-name>error</servlet-name> <servlet-class>servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
一个servlet 可以指定一些前缀或者后缀等等……
注:通配符前不可有当前项目的路径:
/*.do
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
优先级问题: 固有的映射路径优先级最高 所以 映射的路径为 默认路径时 并不会覆盖其他固有的映射路径
1.5、 ServletContext
web容器在启动的时候,它会为每一个we程序创建一个对应的Servlet对象,它代表了当前的web应用
1、 数据共享
// 获得数据
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext对象 以存储数据
ServletContext context = this.getServletContext();
//使用setAttribute(String,Object)方法 以键值对形式存储
context.setAttribute("userName",new String("秦疆"));
}
}
// 拿到数据
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 首先拿到ServletContext对象 以拿数据
ServletContext context = this.getServletContext();
//设置 编码格式 防止 乱码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
// 拿到数据 并且 输出到浏览器中
resp.getWriter().println((String) context.getAttribute("userName"));
}
}
<!-- 配置文件 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
访问时,先访问存放数据的地址 再访问拿数据的地址 才会有数据
2、获取初始化参数
在web.xml中设置初始化参数
<context-param>
<param-name>url</param-name>
<param-value>root</param-value>
</context-param>
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>sd3</servlet-name>
<servlet-class>servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>