SpringMvc和servlet對比


一、servlet實現登錄。

咱們先來看一下servlet實現注冊登錄。

 

  • <servlet>  
  •      <servlet-name>LoginServlet</servlet-name>                                3
  •      <servlet-class>demo.servlet.LoginServlet</servlet-class>             4
  • </servlet>  
  • <servlet-mapping>  
  •      <servlet-name>LoginServlet</servlet-name>                                 2
  •      <url-pattern>login</url-pattern>                                                      1
  • </servlet-mapping 

       訪問順序為1—>2—>3—>4,其中2和3的值必須相同。

url-pattern 標簽中的值是要在瀏覽器地址欄中輸入的 url,可以自己命名,這個 url 訪問名為 servlet-name 中值的 servlet,兩個 servlet-name 標簽的值必須相同,因為通過 servlet 標簽中的 servlet-name 標簽映射到 servlet-class 標簽中的值,最終訪問 servlet-class 標簽中的 class。

還有,web.xml 的 / 表示的是http://localhost:8080/ + 工程名。轉自(點擊打開鏈接

1、jsp頁面

<form action="login" method = "post">
用戶名:<input type="text"name = "userName"><br>
密     碼:<input type="password"name = "password"><br>
<input type="submit" value="登錄">

 

2、點擊登錄按鈕后,提交表單,首先匹配web.xml中的路徑,找到<url-pattern>值是login的sevlet,然后根據name去匹配servlet類,找到LoginServlet。

 
public class LoginServlet extends HttpServlet implements Servlet {  
    @Override  
    protected void doGet(HttpServletRequest request,  
            HttpServletResponse response) throws ServletException, IOException {  
        doPost(request, response);  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest request,  
            HttpServletResponse response) throws ServletException, IOException {  
        String result = "";  
        // 獲取用戶名  
        String userName = request.getParameter("userName");         
        // 獲取密碼  
        String passwd = request.getParameter("password");              

        UserDao.SelectForLogin(userName, password); //數據中查找此人
request.getSession().setAttribute("userName", userName); response.sendRedirect("login_success.jsp");
  }
}
 

 

3、然后再跳轉到登陸成功頁面

 <body>  
        <div align=center>  
            ${userName } 歡迎您,登錄成功!  
        </div>  
 </body>  

 

但是總是需要手寫跳轉servlet,開發效率比較低,所以就涌現除了很多框架,比如struct2,spring等等。

 

二、springMVC

由於SpringMVC是方法級別的攔截,SpringMVC的方法之間基本上獨立的,獨享request response數據。它還可以和很多框架進行無縫集成,開發效率和性能高。現在很多公司都采用springMVC來進行開發,咱們公司也是采用springMVC來進行。下面我介紹一下springMVC如何實現注冊登錄。

1、jsp頁面(登錄)

 

 
<div class="content">
    <form action="login.do" method="post">
用戶名:<input type="text" name="userName">
        <p>
密&nbsp;&nbsp;&nbsp;&nbsp;碼:<input type="password" name="password">
        <p>
            <input class="submit" type="submit" value="登錄">
    </form>
</div>
 

 2、然后同樣是匹配web.xml

 
<servlet>  
        <servlet-name>spmvc</servlet-name> 
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
          <servlet-name>spmvc</servlet-name>
          <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 

 上面這段xml的意思就是,所有的以.do結尾的action都讓org.springframework.web.servlet.DispatcherServlet這個類來處理。load-on-startup元素標記容器是否在啟動的時候就加載這個servlet(實例化並調用其init()方法)。這時servlet不用初始化,而是交給容器去處理。

 

Spring主要也是通過DispatcherServlet實現了Servlet這個接口,又叫前端控制器,來自前端的請求會先到達這里,它負責到后台去匹配合適的handler。DispatcherServlet的主要工作流程如下:

前端請求到達DispatcherServlet。

前端控制器請求HandlerMappering 查找Handler。

如果查找到存在的處理器,進一步去調用service和dao層

返回結果再到controller層,渲染具體的視圖,返回結果給頁面。

3、然后加載sringMVC-servlet.xml配置文件。

<!-- 可以掃描controller、service、...
這里讓掃描controller,指定controller的包
-->
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.qunar.fresh2017.controller"></context:component-scan>

 

4、然后開始掃描controller這個類,找到login.do。這時是通過注解來找到自己所需要的方法。

 
        
 
/**
 * 用戶登錄時,檢查數據庫中是否存在此人
*
 * @param userName    輸入的用戶名
* @param password    輸入的用戶密碼
* @param httpSession 設置session
 * @return 登陸成功返回登錄成功,否則返回登錄失敗
*/
@RequestMapping("login.do") public String login(String userName, String password, HttpSession httpSession,
HttpServletRequest request,HttpServletResponse resp) throws UnsupportedEncodingException {

    User user = UserDao.SelectForLogin(userName, password); //數據中查找此人
   Optional<User> userPresent = Optional.of(user);
    if (userPresent.isPresent()) {

    Cookie cookie = new Cookie("nickName", URLEncoder.encode(user.getNickName(), "utf-8"));
    cookie.setMaxAge(24 * 60 * 60 * 7);
    resp.addCookie(cookie);
    request.setAttribute("nickName",user.getNickName());
    resp.setCharacterEncoding("utf-8");
    LOGGER.info("數據庫里有這個人");
       return "welcome";
  } else {
        LOGGER.info("數據庫里沒有這個人");
  }

    return "loginerror";
}
 
 
        

 

@RequestMapping("login.do") 這個注解是SpringMVC中的一個注解,該注解說明的是,對於login.do的請求,
通過注解標簽下面的方法進行響應。相當於方法的一個URL。

 

5、最后在返回登錄成功界面

這時需要spring-servlet.xml里的視圖解析器。

 

 
<!-- 視圖解析器
解析jsp解析,默認使用jstl標簽,classpath下的得有jstl的包
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路徑的前綴 -->
<property name="prefix" value="/"/>
<!-- 配置jsp路徑的后綴 -->
<property name="suffix" value=".jsp"/>
</bean>
 

 

 

 

上面這段代碼的意思是解析controller中方法返回的jsp頁面,前綴加“/”表示webapp根目錄,配置后綴“.jsp”表示自動在返回值后加.jsp后綴,這樣就找到了webapp下的wecome.jsp。

 

 
        
<div class="welcomediv">
  歡迎:${nickName} </div>

通過EL表達式顯示登錄用戶昵稱。

至此springMVC登錄功能就實現完成了。

 

spring框架已經是java web開發很主流的框架,這個框架有很多優點當然也有它的不足之處,比於之前的servlet,它一定程度上簡化了開發人員的工作,使用servlet的話需要每個請求都去在web.xml中配置一個servlet節點,而Spring 中的DispatcherServlet他會攔截所有的請求,進一步去查找有沒有合適的處理器,一個前端控制器就可以。

 

下面在介紹一下session和cookie的使用方法。

  1、session

 新建session,並添加參數。

 

HttpSession session = request.getSession(); 
session.setAttribute("nickName", value); 

jsp頁面獲取session

${nickName}

過濾器獲取session
 
        
String nickName = (String) session.getAttribute("nickName");

2、cookie
新建cookie
Cookie cookie = new Cookie("nickName", URLEncoder.encode(user.getNickName(), "utf-8"));
cookie.setMaxAge(24 * 60 * 60 * 7);
resp.addCookie(cookie);
request.setAttribute("nickName",user.getNickName());
resp.setCharacterEncoding("utf-8");

 jsp頁面獲取cookie值

${nickName}
過濾器獲取cookie
 
  Cookie[] cookies = servletRequest.getCookies();
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals("nickName")) {
                    nickName = URLDecoder.decode(cookies[i].getValue());
                    break;
                }
            }
        }
 
 
轉自 https://www.cnblogs.com/haolnu/p/7294533.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM