写一个servlet
1、创建包:src目录下-com.bdqn.servlet
2、创建类:servlet
3、继承HttpServlet
4、在类的上面写注解
5、重写方法
@WebServlet("/ser01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收请求
String uname=req.getParameter("uname");
System.out.println("请求的参数:"+uname);
//响应结果
resp.getWriter().write("hello"+uname);
}
}
重写doGet和doPost请求,其实一般只要重写上面那个方法就可以了,它里面定义的方法会判断是post请求还是get请求,然后再执行。
在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service()方法中写了根据请求方式的不同调用doget()和dopost()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Get请求.....");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Post请求.....");
}
解决乱码看这里!直接copy!
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
servlet的生命周期:
init()初始化 会自动调用 只执行一次—>service()当客户端有请求到达时 就会执行–>destory()当应用程序停止时就会销毁
//当有请求到达时 就会执行多次
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
System.out.println("Service....");
}
//服务器自动调用 当Servlet被销毁(应用程序停止)时执行
@Override
public void destroy() {
System.out.println("destroy...");
}
//服务器自动调用 只执行一次 在第一次访问Servlet时执行
@Override
public void init() throws ServletException {
System.out.println("init.....");
}
使用response.sendRedirect(String path)来进行页面的重定向:
request在当次的请求的url之间有效一次传参数,速度快,缺点是参数只能取一次
forward是转向,将现在的请求转交,他只能在同一个容器里使用同时保存客户的请求状态。
sendRedirect是重定向,可以在同一个容器里使用,也可以发送其他容器请求,但是会丢失请求信息。它等于重发一个请求。
request.setAttribute是在请求域里面加了一个请求的参数,所以在sendRedirect以后是无法取到request.setAttribute的请求的。
requestgetAttribute()与request.setAttribute()
request.getAttribute(“nameOfObj”)可得到JSP页面一表单中控件的Value。其实表单控件中的Object的 name与value是存放在一个哈希表中的,所以在这里给出Object的name会到哈希表中找出对应它的value。
而不同页面间传值使用request.setAttribute(position, nameOfObj)时,只会从a.jsp到b.jsp一次传递,之后这个request就会失去它的作用范围,再传就要再设一个 request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值。
P.S.:JavaScript与JSP中不能相互传值,因为JavaScript运行在客户端,而JSP运行在服务器端。若想使它们之间可以相互传递参数,可以在JSP中设置一个hidden控件,用它的value结合上面所说的用法来传递所需的数值。
ServletContext域与Request域的生命周期比较?
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中
客户端地址与服务器端地址的写法?
客户端地址:
是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名 称
eg: 直接输入地址,重定向
服务器端地址:
服务器内部资源的跳转的地址,特点:不需要写web应用的名称
eg: 转发