Servlet一(servlet的配置、servlet对象、servletConfig、参数传递、include和forward的区别、getparameter和getAttribute的区别)

servlet是运行在服务端的java程序,符合所有的java规范。没有main方法,他的生命周期交由容器(Tomcat)来管理。是基于http和TCP之上的。Servlet程序要实现Servlet接口。
Tomcat容器:用来运行web程序,是一个web服务器软件的组件。目录结构:

  • Bin里面放置了启动和关闭tomcat的脚本
  • Conf放了相关的配置文件
  • Lib 放了 tomcat 用到的 java 库
  • Webapps 布署 web 应用(网站)的目录

Servlet的作用:前端的页面从用户处获取到数据后以请求的形式发送到servlet的程序,数据经过程序处理进行响应。
设置URL和servlet的对应关系:
1.在web.xml中配置Servlet

 <servlet>
        <servlet-name>firstservlet</servlet-name>
        <servlet-class>com.servlet01.Servlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>firstservlet</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>

访问到welcome这个url时,根据会得到servlet的名字,根据名字会得到servlet的路径,因此就可以实例化一个servelt对象。
2.通过注释:在web.xml中的web-app标签中加

metadata-complete="false"

然后在servlet程序上加

@WebServlet("/welcome")

metadata-complete="false"表示可以通过xml配置文件来映射,也可以通过注释。为true时,只能通过配置文件。默认为false。一个servlet可以对应多个URL,可以在web.xml中写多个url-pattern。

servletConfig接口:tomcat启动时,会加载servlet上的annotation或加载web.xml文件,为每一个servlet程序实例化一个servletConfig对象。servletConfig对象中封装了servlet的名字,servlet的初始化参数。可在servlet的配置或注释中加一些初始化的参数,这些初始化参数可以通过servleConfig对象获取。也可以通过servletConfig对象来获得servletContext对象。
通过配置文件(web.xml)加初始化的值:

 <servlet>
        <servlet-name>firstServlet</servlet-name>
        <servlet-class>Servlet01</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>24</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>firstServlet</servlet-name>
        <url-pattern>/servlet01</url-pattern>
    </servlet-mapping>

通过注释来加初始化信息:

@WebServlet(value = "/servlet02",
    initParams ={@WebInitParam(name="name",value="李四"),
        @WebInitParam(name="age",value="26")})

初始信息的遍历(枚举类型的遍历):

ServletConfig sc=this.getServletConfig();//调用servet接口中的方法。
Enumeration<String> names=sc.getInitParameterNames();
while(names.hasMoreElements())
{
	String name=names.nextElement();
	String value=sc.getInitParameter(name);
	System.out.println(name+"---------"+value);
}

servlet的对象:启动tomcat后,实例化servletConfig。当访问到某个servlet的时候,才会new一个servlet对象,调用init方法,将servletConfig对象传入并实例化servlet对象。可以通过修改loadonstartup的值来修改实例化servlet对象的时机。为0时,启动tomcat就会实例化servlet对象。值越小越先实例化。这个属性可以在@WebServlet中加,也可以在web.xml中的servlet配置中添加。之后的请求都是直接调用service方法,不会再次实例化对象。因为servlet是单实例常驻服务器内存的。当服务器关闭时,会调用destroy方法销毁servlet对象。
GenericServlet抽象类:实现了Servlet和ServletConfig接口。写servlet类的时候,继承该类,重写service方法。通过源码发现,该类多了两个做日志的log方法。日志会被打印在tomcat localhost log框中。
HttpServlet:该类继承GenericServlet,实现其抽象方法service,实现的途径是调用另一个重载的方法service(HttpServletRequest arg0,HttpServletResponces arg1),该方法调用内部的doxxx方法。在写servlet程序继承该类比较简便。
ServletRequest和ServletResponse:分别将请求和响应封装成两个类,ServletRequest中有一个map,提供了setAttribute、getAttribute、RemoveAttribute的方法。还有个getParameter用来获取用户的请求中的参数。HttpServletRequest和HttpServletResponse增加了对报头的处理,HttpServletRequest可以得到session,HttpServletResponse可以写cookie。
ServletContext:Tomcat启动后,会为每一个web应用实例化一个ServletContext对象,这个对象为web中的所有ServletConfig对象所共享。直到服务器关闭,ServletContext对象才会被销毁。存放了web的全局信息。比如页面被访问的次数,被多少人访问等。
生命周期:

  • servlet:默认情况下,访问到时才会实例化。但是可以在web.xml或通过注释来设置。单实例常驻服务器内存。宕机时销毁。
  • servletConfig:启动Tomcat时就会实例化
  • ServletRequest和ServletResponce:每访问一次servlet,会实话一次。访问结束后被销毁。
  • ServletContext:Tomcat启动后就会实例化,宕机时销毁。

从一个servlet跳转到另外一个servlet中的参数传递:以登录验证程序为例,程序启动时,进入登录页面。填写好用户名和密码后提交到servlet,通过ServletRequest的getparameter方法获得参数。登陆成功后携带用户名这个参数调转到欢迎页面。欢迎xxx
1.通过前端的标签

//页面调转,get传参
printWriter.println("<script>window.location='welcome?username="+username+"';</script>");

2.设置响应的状态码,进行重定向

resp.setStatus(302);//对报头的操作。设置为重定向的状态码
//username通过getParameter得到
resp.setHeader("location","welcome?username="+username);

3.将参数放到ServletRequest中的map里,进行请求转发,并将当前的形参请求作为实参传递过去。RequestDispatcher中有两个方法:include和forward。其中include执行完后原来的servlet中的响应对象还可以继续响应,forward执行完后原来serlvet中的响应对象不能继续响应

req.setAttribute("user",username);//放入参数
RequestDispatcher requestDispatcher=req.getRequestDispatcher("welcome");//跳转的对象
requestDispatcher.forward(req,resp);//进行带值跳转,也可以用include

include和forward的区别:

req.setAttribute("user",username);
RequestDispatcher requestDispatcher=req.getRequestDispatcher("welcome");
requestDispatcher.include(req,resp);
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
resp.getWriter().println("<h1>当前时间:"+dateFormat.format(new Date())+"</h1>");
this.log("测试结束");

用include跳转时,页面会出现时间。用forward跳转时,页面不会出现时间。forward跳转执行完,ServletResponces对象会被销毁。但是无论是哪一个,this.log都会执行。

welcome页面获取参数:

 printWriter.println("<h1>Welcome,"+(String) req.getAttribute("user")+"</h1>");

getParameter和getAttribute的区别:getParameter是用来获取请求的参数,比如get传参中追加在URL后面的参数,post传参中表单中的参数。getAttribute获取的是servletRequest中的map值的值。
4.将参数放到session中,进行无参跳转。然后在welcome页面中通过session获取。一个用户多次访问服务器,session对应的是同一个。

HttpSession httpSession=req.getSession();
httpSession.setAttribute("username",username);
resp.sendRedirect("welcome");

在welcome页面获得用户面这个参数:

//先获得session,在通过session来获得键值对中的username对应的值。
String name=(String)req.getSession().getAttribute("username");
printWriter.println("<h1>Welcome,"+name+"</h1>");
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值