1 Servlet介绍
服务端小程序,是使用Java语言编写的服务器端程序,可以向JSP一样,生成动态的WEB页面,Servlet主要运行在服务器端,并且服务器调用执行,是一种按照Servlet标准开发的类
- 请求过程图
- 要想在程序中实现Servlet必须继承HttpServlet这个抽象类
2 第一个servlet
一个类要想做为Servlet必须要经过编译和配置
public class Demo01 extends HttpServlet {
// 重写父类的方法
public void doGet(HttpServletRequest req,HttpServletResponse response){
response.setCharacterEncoding("gbk");
PrintWriter printWriter = null;
try {
printWriter = response.getWriter();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printWriter.write("我是一个servlet程序");
}
}
配置文件,需要在web.xml中配置servlet的映射路径
<servlet>
<servlet-name>demo2</servlet-name>// servlet名称
<servlet-class>com.zhao.Demo01</servlet-class>// 编译后的类名
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo02</url-pattern>// 映射路径
</servlet-mapping>
3 Servlet和表单
- 提交路径的问题
- post get处理方式不同
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse response){
response.setCharacterEncoding("gbk");
PrintWriter printWriter = null;
try {
printWriter = response.getWriter();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printWriter.write("姓名是:");
String username = req.getParameter("userName");
printWriter.write(username);
}
}
web.xml配置映射路径
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.zhao.Demo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/1demo02</url-pattern>
</servlet-mapping>
JSP
<form action="1demo02" method="post">
<input type="text" name="userName" value=""/>
<input type="submit" name="" value="提交"/>
</form>
4 Servlet生命周期
Servlet的生命周期就是程序的存在周期,Servlet手容器管理,所以容器决定其生命周期
public class Demo01 extends HttpServlet {
public void init(){
System.out.println("初始化。。。。。。");
}
public void doGet(HttpServletRequest req,HttpServletResponse response){
response.setCharacterEncoding("gbk");
PrintWriter printWriter = null;
try {
printWriter = response.getWriter();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printWriter.write("姓名是:");
String username = req.getParameter("userName");
printWriter.write(username);
}
public void doPost(HttpServletRequest req,HttpServletResponse resp){
resp.setCharacterEncoding("gbk");
this.doGet(req, resp);
}
public void destory(){
System.out.println("销毁。。。。。");
}
}
5 取得初始化配置信息
- init() 这个方法里面可以传入一个ServletConfig对象,此对象可以接受初始化参数
- 所有的初始化参数都是在web.xml里面配置
- 如果同时存在init(),和init(ServletConfig config) 只有第二个才会被调用
public void init(ServletConfig config){
System.out.println("获取config信息");
String string = config.getInitParameter("ref");
System.out.println(string);
}
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.zhao.Demo01</servlet-class>
<init-param>
<param-name>ref</param-name>
<param-value>zhaodi</param-value>
</init-param>
</servlet>
6 取得其余的内置对象Session,application
- servelt本身只提供request,response对象,如果想获取Session对象只可以通过request对象获取,request.getSession();
session的实现原理
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务
HttpSession session = req.getSession();// 这个时候已经把sessionID存入客户端Cookie里面了
- 获取application对象
ServletContext application = this.getServletContext();
7 servlet跳转
服务端和客户端跳转的区别
- 服务端:地址栏不发生改变,可以传递request范围的属性,属于无条件跳转,只要之心感到了就立马跳转
- 客户端:地址栏发生改变,无法传递request范围属性,实在所有的操作都执行完毕之后才进行跳转的,语法为response.sendRedirect()
response.sendRedirect("index.jsp");// 客户端跳转
req.getRequestDispatcher("index.jsp").forward(req, response);// 服务端跳转