本文详尽的介绍了servlet的相关知识,包含servlet基础与tomcat相关知识、servlet声明周期原理及其应用、servlet多请求携带数据、以及单个servlet如何处理多请求的相关知识!
servlet
接口定义的是 一套处理网络请求的规范
,所有实现servlet的类,都需要实现它的那五个方法,其中最主要的是两个声明周期方法init()和destory(),还有一个处理请求的service()。不能
Tomcat才是与客户端直接打交道的家伙
),确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,Tomcat再把这个respond返回给客户端。
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
: 运行时生成的文件,最终运行的文件都在这里。
tomcat 基于jdk运行的
需要清理操作系统的环境变量 catalina字样 (重新安装时需要清除
)
关于服务:ip地址+端口号 端口唯一必须遵守规则
tomcat默认端口:8080 代表 tomcat-HOME/webapps/ROOT(没有指定具体项目名时,默认访问ROOT项目)
可以将web程序打包为war包,将其放置到tomcat/webapps
更方便的处理http请求
首先,一个Servlet类必须继承HttpServlet(接口或抽象类)
其次,重写其service方法(doGet\doPost)
再次,将servlet在web.xml注册
<servlet>
<servlet-name>myservlet-name>
<servlet-class>com.xcu.web.MyFirstServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>myservlet-name>
<url-pattern>/loginurl-pattern>
servlet-mapping>
注意:servlet与servlet-mapping 不能交叉
最后,编写html页面表单 发请求
使用反射创建此对象,并将其以servlet-name 对象名
唯一实例
),则直接调用其service方法处理请求;servlet对象由web容器(tomcat、weblogic、websthere、jboss)负责产生
如果没有(重写)service,则实际是执行父类的service方法(子类继承过来的service方法),在其中会根据请求的method调用doGet或doPost方法服务(实际上调用的是子类的)
)(唯一实例)
请求数字
请求日期
请求中文
method=POST
在不同请求模式下中文转码
req.getRequestDispatcher("页面或servlet").forward(req,resp);
resp.sendRedirect("页面或servlet");
重定向
,不能使用请求转发
,否侧刷新
时会重复执行上一步操作(可能会抛出异常)重定向
在整个业务流程中会触发两次
浏览器请求,刷新时只会出触发后一次查询的
浏览器请求请求转发
在整个业务流程中只会触发一次
浏览器请求,刷新时会触发整个业务流程(包括插入和查询)1. EL表达式特性
2. JSTL表达式特性
<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>
action="teacher?method=addTeacher"
的请求url携带参数,可以看作是get
方式请求,而其属性method="post"
提交方式为post
请求,所以此种请求方式可以看作是get-post携带数据请求
get-post携带数据请求
的方式,在被请求的servlet
中无论是url后携带的参数(get请求携带参数
),还是通过post请求携带参数
(请求体中携带的参数),均可以使用getParamter("xxx")
获取参数核心思想
method=xxx
,并在所请求的servlet中编写相同参数值名称的方法,处理相应的请求servlet的service方法中获取method参数值
,并通过反射
获取到方法对象
示例
<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>
@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");
}
}