美文网首页
Servlet详解

Servlet详解

作者: 郑在学_blog | 来源:发表于2017-06-29 22:25 被阅读0次

如果网页显示的内容在服务器的数据库中,除了负责显示的HTML标记之外,必须还要有完成这些业务功能的代码存在。这种网页我们就叫做动态网页。为了实现动态网页的目标,JavaServlet技术因应而生,它能够以一种可移植的方法来提供动态的、面向用户的内容。

Servlet的运行过程

⒈ 客户端发送请求至服务器端;
⒉ 服务器端根据web.xml文件中的Servlet相关配置信息,将客户端请求转发到相应的>Servlet
⒊ Servlet引擎调用Service()方法,根据request对象中封装的用户请求与数据库进行交>互,返回数据之后,Servlet会将返回的数据封装到response对象中;
⒋ Servlet生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端>的请求 
⒌ 服务器将响应返回给客户端

配置文件

<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.cn.control.LoginServlet</servlet-class>
  </servlet>
  
  <servlet>
    <servlet-name>upload</servlet-name>
    <servlet-class>com.cn.control.FileServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  
  <servlet-mapping>
    <servlet-name>upload</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping> 

servlet处理过程

public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    ...
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        this.doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        System.out.println("login............");
        
        String username = (String) request.getParameter("username");
        String pass = (String)request.getParameter("pass");
        
        System.out.println("login............"+username+"==="+pass);
        
        User user = new User();
        user.setPass(pass);
        user.setUsername(username);
        
//      if(new LoginService().login(user)){
//          response.sendRedirect("success.html");
//          
//      }else{
//          response.sendRedirect("fail.html");
//      }
            
        StringBuffer stringBuffer = new StringBuffer();
        
        if(new LoginService().login(user)){
            
            stringBuffer.append("{'message':[{'code':'200','str':'登录成功'}]}");
        }else{
            stringBuffer.append("{'message':[{'code':'100','str':'登录失败'}]}");
            
        }
        
        response.getOutputStream().write(stringBuffer.toString().getBytes("GBK")); 
            
    }

调用Service方法

public class LoginService {

    public boolean login(User user){
        boolean flag = false;
        
        Connection conn = DBHelper.getConn();
        
         PreparedStatement prestate;
         
         String sql = "select * from user where username = ? and pass = ?";
         try{
             prestate = (PreparedStatement) conn.prepareStatement(sql);
             
             prestate.setString(1, user.getUsername());
             prestate.setString(2, user.getPass());
             
             ResultSet  result = prestate.executeQuery();
             
             while(result.next()){
                 String username = result.getString(1);
                 
                 System.out.println("username is "+username);
                 
                 flag = true;
             }
             
         }catch(Exception ex){
             ex.printStackTrace();
         }
        
        return flag;
    }
    
}

连接服务器中数据库的JDBC

public class DBHelper {

    public static Connection getConn() {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/renaitable";
        String username = "root";
        String password = "root";
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,���ض�Ӧ����
            conn = (Connection) DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

Servlet如何同时处理多个请求?

  • Servlet采用多线程来处理多个请求的同时访问。Servlet容器通过线程池来管理维护服务请求。所谓线程池,相当于数据库连接池,实际上是等待执行代码的一组线程,叫做工作者线程。Servlet容器通过一个调度线程来管理工作者线程。
  • 当容器收到一个Servlet的访问请求,调度者线程就从线程池中选出一个工作者线程,将用户请求传递给该线程,然后由该线程处理Servlet的service()方法;
  • 当这个线程在执行的时候,容器收到一个新的请求,调度者线程再次从线程池中选出一个新的工作者线程;
    当容器同时收到对同一个Servlet的多个请求时,那么Servlet的service方法将在多线程中并发执行。

如何开发线程安全的Servlet?

Servlet容器采用多线程来处理请求,提高性能的同时也造成了线程安全问题。要开发线程安全的Servlet应该从一下几个方面进行:
1. 变量的线程安全; 多线程并不共享局部变量,所以我们要尽可能的在Servlet中使用局部变量;
2. 代码块的线程安全; 使用同步块Synchronized,防止可能调用的代码块;但是要注意的是,要尽可能得缩小同步代码的方范围,不要在service方法和响应方法上直接使用同步,这会严重影响性能。
3. 属性的线程安全; ServletContext,HttpSession,ServletRequest对象中属性;
4. 使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap;
5. 不要在Servlet中创建自己的线程来完成某个功能; Servlet本身就是多线程的,如果再创建新的线程,将会导致线程执行复杂化,出现线程安全问题;
6. 在多个Servlet中,对外部对象,比如:文件;进行修改操作一定要加锁,做到互斥访问;

相关文章

  • Java Servlet API

    Servlet 支持的版本 Servlet 3.0 新特性详解 Servlet 3.0 新特性概述Servlet ...

  • Servlet详解

    一、Servlet中的线程安全问题 二、Servlet的配置对象: 三、ServletContext详解 插入:S...

  • javaweb学习总结(一)servlet开发

    一、ServletConfig详解 1.1 配置Servlet初始化参数 在Servlet的配置文件中,可以使用一...

  • 详解Servlet

    Server + Applet Servlet接口(拿到一套规范 我们第一时间 关注接口) 以上 我们可以看到Se...

  • servlet详解

    servlet简介 servlet是在java EE平台中用于接收和响应终端用户的请求。它是所有web应用程序的核...

  • Servlet详解

    Servlet 简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套...

  • 详解servlet

    什么是Servlet Servlet是Server+Applet的缩写,表示一个服务应用。其实Servlet就是一...

  • Servlet详解

    如果网页显示的内容在服务器的数据库中,除了负责显示的HTML标记之外,必须还要有完成这些业务功能的代码存在。这种网...

  • Servlet 的常见错误总结

    Servlet 的常见错误总结 HTTP状态码详解 404错误:资源未找到原因一:在请求地址中的servlet的别...

  • Servlet中涉及到的Filter和Listener

    Servlet中的过滤器和监听器详解 过滤器 Filter 并不是一个标准的Servlet ,它不能处理用户请求,...

网友评论

      本文标题:Servlet详解

      本文链接:https://www.haomeiwen.com/subject/mgbvcxtx.html