servlet使用回顾和在MVC模式下servlet的使用。

一:servlet简介       

       jsp的本质就是servlet,servlet可以理解为一个需要配置或者注解,而且必须要继承HttpServlet的java类,这个类的主要作用是可以响应浏览器发出的请求(get、Post). 但是直接用out流输出界面的开发方法效率过低,工作量很大,在MVC流行的今天,servlet一般只用作C使用,即控制器。


一:Servlet的开发

servlet可以响应客户端的四种请求:

 >.doGet()

 >.doPost();

 >.doPut();

 >.doDelete();

但是客户端通常只有doGet和doPost请求。而且一般只重写一个doService()请求就会响应客户端的所有请求。

其中还包含两个方法:

init(ServletConfig config);创建servlet实例,初始化参数。

destory();销毁。

这两个方法一般无需重写。除非在初始化servlet的时候需要初始化某些资源才考虑重写这个init()方法,如果在销毁servlet之前要完成某些资源的回收,才考虑重写destory()方法。


二:servlet配置

        servlet的源文件并不能响应客户端的请求,必须把他编译成.class文件才行,.class文件一般放在WEB-INF/class的对应的包下面。

        为了能响应客户端的请求,必须要对servlet进行配置,在servlet3.0之后,有两种方法对servlet进行配置 1,注解的方式   2,修改web.xml文件。 但是一般都用第二种方法。


配置一个servlet


源码:MyFristServlet.java


public class MyFristServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)
{
try {
request.setCharacterEncoding("GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintStream out = null;
try {
out = new PrintStream(response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

out.println("my Frist Servlet");

}
}



在web.xml中增加如下的配置:

<servlet>
     <servlet-name>MyFristServlet</servlet-name>
     <servlet-class>MyFristServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>MyFristServlet</servlet-name>
      <url-pattern>/MyFristServlet</url-pattern>
  </servlet-mapping>


访问http://localhost:8080/Dome/MyFristServlet 


三:jsp/servlet的生命周期


1.创建servlet实例(第一次请求或者是web应用启动的时候)

2,web容器调用init()方法对servlet进行初始化。

3,在容器中存在等待程序的调用。

4,销毁


创建-->完成初始化-->响应客户端的请求-->完成资源的回收-->销毁实例。


1,创建:<load-on-startup>标签进行初始化


下面是一个简单的servlet,不响应客户端的请求,只输出时间。

public class showTime extends HttpServlet{



public void init(ServletConfig config) throws ServletException{
super.init(config);

Timer time=new Timer(1000,new ActionListener() {

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(new Date());
}
});

time.start();
}
}


在web.xml中增加如下的配置:

 <servlet>
     <servlet-name>showTime</servlet-name>
     <servlet-class>showTime</servlet-class>
     <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>showTime</servlet-name>
      <url-pattern>/showTime</url-pattern>
  </servlet-mapping>
</web-app>


启动服务器,不需要请求,就会在控制台看见间隔打印出的时间信息。



2,访问servlet的参数配置


servlet获取参数的方法和JSP中获取配置参数的方法几乎一样,可以用ServletConfig对象获取配置参数。


获取servlet源码:


import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;


import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;




public class getParamServlet extends HttpServlet{


public void  service(HttpServletRequest request,HttpServletResponse response) throws IOException{
//获取servletConfig对象
ServletConfig servletConfig=getServletConfig();

String name=servletConfig.getInitParameter("name");

Enumeration sports=servletConfig.getInitParameterNames();


PrintStream out=new PrintStream(response.getOutputStream()); 

while(sports.hasMoreElements()){
out.println(servletConfig.getInitParameterNames()+":"+servletConfig.getInitParameter(sports.nextElement().toString()));
}

   out.println("name"+name);
   
}
}


配置文件web.xml中增加配置:

<servlet>
     <servlet-name>getParamServlet</servlet-name>
     <servlet-class>getParamServlet</servlet-class>
      <init-param>
        <param-name>age</param-name>
        <param-value>30</param-value>
     </init-param>
     <init-param>
        <param-name>name</param-name>
        <param-value>wpz</param-value>
     </init-param>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>getParamServlet</servlet-name>
      <url-pattern>/getParamServlet</url-pattern>
  </servlet-mapping>



四:MVC模式下servlet的使用:

 上面已经说过,在MVC的模式下,servlet如今的主要作用就是作为控制器使用,下面就举一个标准MVC下servlet使用的例子。

 在MVC模式中jsp负责收集用户的信息或者说是请求的参数列表,将请求发送给servlet,servlet在处理后将处理的结果返回给jsp,jsp再呈现给用户,这里  jsp是MVC中的V (view) 、servlet是C(controller),servlet所依赖的实体类为M(Model).


下面就是一个简单的MVC实现登录的例子:

login.jsp:登录界面

LoginServlet.java:登录处理的servlet

DBDao:用于查询和存储用户名、密码

welcome.jsp:成功界面


login.jsp界面源码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'Login.jsp' starting page</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
  </head>
  <body>
  <% 
      if(request.getAttribute("errMsg")!=null){
        out.println(request.getAttribute("errMsg"));
      }
  %>
    <form action="loginServlet" method="post">
             用户名:<input type="text" name="username"/><br>
             密      码:<input type="text" name=password/><br><hr/>
       <input type="submit" value="提交"/>
    </form>
  </body>
</html>



欢迎界面(登录成功)welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'welcome.jsp' starting page</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
  </head>
               欢迎<%=session.getAttribute("username")%>登录
  <body>
    This is my JSP page. <br>
  </body>
</html>



DBDao.java

package www.clsc.com;
public class DBDao {
String username;
String  password; 
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}



处理的Servlet

package www.clsc.com;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class loginServlet extends HttpServlet {
public void service(HttpServletRequest request,HttpServletResponse response){
String username=request.getParameter("username");
String password=request.getParameter("password");
String errMsg="";
DBDao dbDao=new DBDao();
RequestDispatcher de;
try {
request.setCharacterEncoding("UTF-8");
dbDao.setPassword("222");
dbDao.setUsername("wpz");
//登录状态判断
if(dbDao.getUsername().equals(username)){
System.out.println(password);
if(dbDao.getPassword().equals("222")){
//成功。跳转到成功界面
HttpSession session=request.getSession();
session.setAttribute("username", username);
   de=request.getRequestDispatcher("/welcome.jsp");
de.forward(request, response);
}else{
System.out.println("here");
errMsg+="密码不正确";
}
}else{
errMsg+="用户不存在";
}
} catch (Exception e) {
e.printStackTrace();
}
if(null!=errMsg&&""!=errMsg){
//失败
de=request.getRequestDispatcher("/Login.jsp");
request.setAttribute("errMsg",errMsg);
    try {
de.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注网赚的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值