JavaWeb学习之Servlet基础
Posted 听路走歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习之Servlet基础相关的知识,希望对你有一定的参考价值。
学习笔记仅供参考,如有错误,请多指出
java学习路上,与君共勉
作者:小饭
前言
原理操作来源于狂神说java的视频,所用图片来源于网络
基本上是看b站视频自己摘抄的笔记,保存到csdn是为了把笔记精华分享给大家,以及方便自己复习
1,Servlet简介
Servlet就是sun公司开发动态web的一门技术
sun在这些API中提供一个接口接口叫做:Servlet,如果开发一个Servlet程序,只需要完成两个小步骤:
-
编写一个类,实现Servlet接口
-
把开发好的java类部署到web服务器中
把实现了Servlet接口的程序叫做Servlet
2,HelloServlet
Servlet接口在Sun公司有两个默认的实现类:HttpServlet,GenericServlet
-
构建一个普通Maven项目,删掉里面的src目录,在项目中建立Module;这个空工程就是Maven的主工程
-
创建java web项目后,需要添加servlet,jsp依赖到pom.xml
//servlet依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> //jsp依赖 <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> </dependency>
-
右击项目名,创建一个Module,创建一个web-Maven项目
-
关于Maven父子工程的理解:
父项目中有
<modules> <module>servlet-1</module> </modules>
父项目中java子项目可以直接使用
son extends father
-
Maven环境优化
1.修改web.xml为最新(在tomcat的webapp中找)
<?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>
2.将Maven的结构搭建完整
新创建mian->java->resources
-
编写一个Servlet程序
1.编写一个普通类(在java中创建包,一般为三级目录com.fan.HelloServlet)
2.实现Servlet接口,直接继承HttpServlet
public class HttpServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入到doGet方法");
resp.setContentType("text/html;charset=UTF-8");//防止中文乱码
PrintWriter writer = resp.getWriter();
writer.println("HelloServlet,好好学习");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
编写Servlet的映射
为什么需要映射:我们写的是java程序,但是程序需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给她一个浏览器可以访问的路径;
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.fan.Servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern> <!--映射-->
</servlet-mapping>
配置tomcat
注意:配置项目发布的路径
启动测试
提示:如果项目出现中文乱码问题
在java文件中写入: resp.setContentType("text/html;charset=UTF-8");
3,Servlet原理
1, Servlet原理图:
2, 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>/hello</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可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
/*:通配符,代表输入任何东西
-
一个Servlet可以指定一些后缀或者前缀等等
-
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> //默认请求路径(不建议这种写法)
-
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.fan</url-pattern> </servlet-mapping> //可以自定义后缀实现映射,但是注意*前面不能加项目映射路径
-
优先级问题
制定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
4,ServletContext
web容器在启动的时候,它会为每个web程序创建一个ServletContext对象。它代表了当前的web应用
共享数据:
我在这个servlet中保存的数据,可以在另外一个servlet中拿到
写两个java文件
set:
public class HelloServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello word");
ServletContext context = this.getServletContext();
String username = "小饭";
context.setAttribute("username",username);//将一个数据保存在ServletContext中,名字为:username,值为:username
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
get:
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().println("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
配置web.xml文件 注册两个servlet
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.fan.servlet.HelloServletDemo</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.fan.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
最后:测试访问结果
如果先访问get,页面显示名字+null,
如果先访问set,再进入get,则输出名字+set输入的内容
获取初始化参数
<!--配置一些web应用的初始化参数 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/study?&useSSL=false&serverTimezone=UTC</param-value>
</context-param>
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().println(url);
resp.setContentType("text/html,charset=UTF-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
注册servlet(上文有教程)
请求转发
从a中向b发送指令需求c的内容,b则询问c,c把内容返回给b,a则可以在访问b中得到c的内容
public class Servlet04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了demo04");
ServletContext context = this.getServletContext();
// RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的路径
// requestDispatcher.forward(req,resp);//调用forword实现请求转发;
context.getRequestDispatcher("/gp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
注册servlet,然后访问servlet04,得出的结果是/gp路径的结果
读取资源文件
Properties
-
在java目录中新建properties
-
在resources目录下新建properties
发现都被打包到同一路径:classes,俗称这个路径为:classpath
思路:需要一个文件流:
properties类:
public class PropertiesServlet extends HttpServlet {
public void test(){
Properties properties = new Properties();
}
}
public class Servlet05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB_INF/classes/db.properties");
Properties pro = new Properties();
pro.load(is);
String user = pro.getProperty("username");
String pwd = pro.getProperty("password");
resp.getWriter().println(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
username=root
password=123456
访问测试即可
以上是关于JavaWeb学习之Servlet基础的主要内容,如果未能解决你的问题,请参考以下文章
(转)JavaWeb学习之Servlet----Servlet的生命周期继承结构修改Servlet模板
JavaWeb学习之Servlet----ServletConfig获取配置信息ServletContext的应用(转)