本文详尽的介绍了servlet的相关知识,包含servlet基础与tomcat相关知识、servlet声明周期原理及其应用、servlet多请求携带数据、以及单个servlet如何处理多请求的相关知识!
一、servlet基础-tomcat
1、Servlet是什么?
- Servlet是什么
- Servlet请求处理
2、安装配置tomcat
2.1 tomcat目录结构
-
bin
: 该⽬录存放的是可执⾏的⼆进制⽂件(startup.bat⽤于启动Tomcat、shutdown.bat⽤于停⽌Tomcat) -
conf
:存放的是Tomcat的配置⽂件(server.xml可以配置Tomcat的端⼝,web.xml) -
lib
此⽬录存放了Tomcat服务器运⾏web项⽬所需的基础类库(jar包) -
logs
: 存放Tomcat服务器的运⾏⽇志、记录了服务器启动、运⾏异常及关闭等操作的记录 -
webapps
:存放Tomcat管理的web项⽬的⽬录
,此⽬录中默认部署了Tomcat管理器等⼏个web项⽬ -
work
: 运行时生成的文件,最终运行的文件都在这里。
2.2 重装Tomcat
-
tomcat 基于jdk运行的
- java_home
- classpath
- path
-
需要清理操作系统的环境变量 catalina字样 (
重新安装时需要清除
) -
关于服务:ip地址+端口号 端口唯一必须遵守规则
-
tomcat默认端口:8080 代表 tomcat-HOME/webapps/ROOT(没有指定具体项目名时,默认访问ROOT项目)
2.3 部署一个web项目
3、Servlet规范的引入
4、如何编写一个servlet类
4.1 作用
- 相比于套接字网络编程,其
更方便的处理http请求
4.2 规范
-
首先,一个Servlet类必须继承HttpServlet(接口或抽象类)
-
其次,重写其service方法(doGet\doPost)
-
再次,将servlet在web.xml注册
- @H_502_292@
<!-- 注册自定义servlet--> <servlet> <servlet-name>my</servlet-name> <!-- 全限定路径名--> <servlet-class>com.xcu.web.MyFirstServlet</servlet-class> </servlet> <servlet-mapping> <!-- servlet在web容器中的对象名 (必须与上面完全一致)--> <servlet-name>my</servlet-name> <!-- 本servlet对外暴露的请求path--> <url-pattern>/login</url-pattern> </servlet-mapping>
注意:servlet与servlet-mapping 不能交叉
-
最后,编写html页面表单 发请求
5.难点
- servlet中的处理方法
二、Servlet生命周期原理及其应用
1、servlet处理请求的流程
- 启动工程,系统会使用该工程的web.xml初始化此项目(包括外部访问url,创建一个servlet对象的名称的引用(句柄))
- 当浏览器访问本服务器上的应用时,应用会自动调用默认的欢迎页面呈现客户
- 用户点击欢迎页面提交表单按钮(以添加新用户信息为例)
- 浏览器会调用该表单的onsubmit方法(进行校验) ,并向由( URL地址 +form.action组成)的新url(ip:端口/应用名/请求path)发出请求
- tomcat服务器接收请求,并解析它,
- 在web.xml的servlet-mapping中查找和请求path路径匹配的 url-pattern节点
- 再继续找url-pattern的兄弟 servlet-name的值(对象名)
- 如果servlet-name所指的对象不存在,则再去servlet节点中查找同名项的兄弟节点servlet-class
- 拿到servlet-class的文本值
使用反射创建此对象,并将其以servlet-name 对象名
- 系统再调用其service方法处理请求,并响应之;
- 如果第二次对此服务path进行请求,则因为以servlet-name为名称的对象已存在(
唯一实例
),则直接调用其service方法处理请求;
2、servlet对象产生过程
servlet对象由web容器(tomcat、weblogic、websthere、jboss)负责产生
- 使用load-on-startup节点可以设置servlet创建的时机,含有load-on-startup节点则在服务器启动时创建servlet对象;如果不含有,则会在首次请求时创建对象
- 再由容器调用init方法初始化servlet对象
- 容器调用service方法提供服务(
如果没有(重写)service,则实际是执行父类的service方法(子类继承过来的service方法),在其中会根据请求的method调用doGet或doPost方法服务(实际上调用的是子类的)
) - 下次,请求来时,直接对外提供服务,不会创建servlet对象
(唯一实例)
- 最后,当容器关闭时,容器会先调用servlet的destroy方法再关闭
3、servlet处理请求多个场景
-
请求数字
- 所有的表单提交的数据均是字符。因此,必须要进行类型转换(常见的有Integer.parseInt\doble.parseDouble\Long.parseLong\Float.parseFloat)
- 需要判空,应为“”或null无法转数字(可以使用三元运算符)
-
请求日期
-
请求中文
- req.setCharacterEncoding(“UTF-8”); //上行编码
- resp.setContentType(“text/html;charset=UTF-8”);//下行转码
- 请求的
method=POST
-
在不同请求模式下中文转码
- get请求乱码必须使用String构造手动转码
4、响应方式
- 请求转向
- 重定向
- 注意事项:
5、EL表达式与JSTL表达式特性
1. EL表达式特性
2. JSTL表达式特性
6、浏览器请求注意事项
- 浏览器会将页面所有标签,按照层级将其构成一个对象树,每一个标签节点时一个对象,其每个对象还有属性和方法,js可以对其进行操作
- 表单提交的任何数据都是string类型(eg: text文本框提交的数据是string类型)
- get请求会将地址后携带的值清除,并携带自己本身的表单值
三、Servlet进阶应用
1、jsp-servlet 处理逻辑
2、get-post携带数据请求
- 代码示例:
<form action="teacher?method=addTeacher" method="post">
姓名:<input type="text" name="tname" /><br/>
性别:<input type="radio" name="gender" value="男" />男
<input type="radio" name="gender" value="女"/>女<br/>
入职日期:<input type="text" name="workDate"/><br/>
教授年级:<input type="text" name="workGrade"/><br/>
<input type="submit" value="添加"/>
</form>
- 请求:
- 数据获取:
3、一个servlet处理多个请求
-
核心思想
-
示例
- 请求
<form action="teacher?method=addTeacher" method="post">
姓名:<input type="text" name="tname" /><br/>
性别:<input type="radio" name="gender" value="男" />男
<input type="radio" name="gender" value="女"/>女<br/>
入职日期:<input type="text" name="workDate"/><br/>
教授年级:<input type="text" name="workGrade"/><br/>
<input type="submit" value="添加"/>
</form>
@H_502_292@ @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException {
// 1.设置编码格式
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 利用反射执行对应的请求方法
String methodName = req.getParameter("method");
try {
Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
// 执行方法
method.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printstacktrace();
} catch (InvocationTargetException e) {
e.printstacktrace();
} catch (illegalaccessexception e) {
e.printstacktrace();
}
}
- 处理请求对应的方法
// 增加
private void addTeacher(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException {
// 2.
String tname = req.getParameter("tname");
String gender = req.getParameter("gender");
String workDate = req.getParameter("workDate");
String workGrade = req.getParameter("workGrade");
Teacher teacher=new Teacher(0,tname,gender,workDate,workGrade);
// 3.
TeacherService teacherService=new TeacherServiceImpl();
boolean b = teacherService.addTeacher(teacher);
// 4.
if (b){
resp.sendRedirect("teacher?method=findAll");
}else {
resp.sendRedirect("error.jsp");
}
}