24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

Servlet基础知识点总结

2017-06-09 16:58:04 东方博宜 阅读

1、servlet:一个特殊的Java类,可以通过url来访问!

作用:起到一个“后台”的作用,负责程序的“中转控制”!

      替代类似于check.jsp这种后台页面!

2、入门案例

A、如何定义一个Servlet?

第一步:要定义一个Java类,继承HttpServlet!

第二步:重写doGet和doPost方法!

第三步:在web.xml中注册该Servlet的基本信息!


LoginServlet:
/**
 * 用来处理登陆请求的中转控制层
 */
public class LoginServlet extends HttpServlet{
/**
 * 重写doGet
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet的doGet被访问!");
}
/**
 * 重写doPost
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 注册Servlet信息 -->
  <!-- 声明节点:声明servlet的路径 -->
  <servlet>
     <!-- Servlet的name,可以自定义 -->
     <servlet-name>LoginS</servlet-name>
     <!-- Servlet的访问路径 -->
     <servlet-class>com.user.servlet.LoginServlet</servlet-class>
  </servlet>
  
  <!-- 映射节点:声明servlet的访问url -->
  <servlet-mapping>
      <!-- 和声明节点的servlet-name一致 -->
      <servlet-name>LoginS</servlet-name>
      <!-- 访问url -->
      <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>


B、如何访问这个Servlet?

通过该Servlet在web.xml中的映射节点的url-pattern的值来访问!


get访问的形式:

http://127.0.0.1:8080/项目名/url-pattern名称

例如:http://127.0.0.1:8080/myservlet01/login


post访问的形式:

index.jsp
   <h1 align="center">
欢迎登陆
</h1>
    
        <!-- action表示提交的目的地址,method表示提交方式 post表示隐含提交  get表示以url带参数的形式提交(默认值) -->
<form action="login" method="post">
<p>
用户名:
<input type="text" name="username" />
</p>
<p>
密码:
<input type="password" name="password" />
</p>
<p>
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</p>
</form>


3、如何确保页面带参数到Servlet中,中文不会乱码?

如果是post带中文参数,在保证编码一致性的情况下是不会乱码的

如果是get带中文参数,则一定会乱码


A、乱码的处理原则:编码一致性!

前端jsp(html)页面、Servlet、数据库、程序和数据库交互的时候都要保证编码一致!

jsp页面:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
Servlet:
/**
 * 重写doPost
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//声明request编码,防止带来的参数乱码
request.setCharacterEncoding("utf-8");
//声明response编码集,防止向页面输出乱码
response.setContentType("text/html;charset=utf-8");

数据库的表:utf8


程序和数据库交互的时候:

DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8","root","");


例子:post带中文防止乱码

index.jsp
   <h1 align="center">
欢迎登陆
</h1>
    
        <!-- action表示提交的目的地址,method表示提交方式 post表示隐含提交  get表示以url带参数的形式提交(默认值) -->
<form action="login" method="post">
<p>
用户名:
<input type="text" name="username" />
</p>
<p>
密码:
<input type="password" name="password" />
</p>
<p>
<input type="submit" value="提交" />
<input type="reset" value="重置" />
</p>
</form>
LoginServlet:
/**
 * 重写doPost
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//声明request编码,防止带来的参数乱码
request.setCharacterEncoding("utf-8");
//声明response编码集,防止向页面输出乱码
response.setContentType("text/html;charset=utf-8");
//向页面输出内容
PrintWriter out = response.getWriter();
System.out.println("Servlet的doPost被访问!");
//获取参数
String u = request.getParameter("username");
String p = request.getParameter("password");
out.print(u + " " + p);
System.out.print(u + " " + p);
//处理参数
//根据处理结果跳转
}

B、get带参数乱码的处理

原因:因为一个中文占2个字节,而网络通过get带参数时采用的是iso8859-1编码(1个字节),因此get带中文,在传输时,需要拆成2个字节传输,在获取到之后,要重新转码!


例子:

index.jsp
<a href="login?username=张三丰">注册请求</a>
LoginServlet:
/**
 * 重写doGet
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet的doGet被访问!");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取参数
String username = request.getParameter("username");
//对get带的中文转码
username = new String(username.getBytes("iso8859-1"),"utf-8");
out.print(username);
}

4、Servlet的代码跳转

A、forward跳转

//获取请求分发器(跳转工具)

RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");

//forward跳转

dispatcher.forward(request, response);


B、重定向跳转

response.sendRedirect("index.jsp?msg=fail");


forward跳转和重定向跳转的区别?

forward跳转url不变,request作用域有效!

重定向跳转url改变,request作用域失效!



5、如何在Servlet中获取Session?

HttpSession session = request.getSession();



例子:

LoginServlet:

/**

* 重写doPost

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//声明request编码,防止带来的参数乱码

request.setCharacterEncoding("utf-8");

//声明response编码集,防止向页面输出乱码

response.setContentType("text/html;charset=utf-8");

//向页面输出内容

PrintWriter out = response.getWriter();

System.out.println("Servlet的doPost被访问!");

//获取参数

String u = request.getParameter("username");

String p = request.getParameter("password");

// out.print(u + " " + p);

// System.out.print(u + " " + p);

//处理参数

boolean r = UserService.check(u, p);

//根据处理结果跳转

if(r == true){

HttpSession session = request.getSession();

//存值标记用户登陆

session.setAttribute("username", u);

//获取请求分发器(跳转工具)

RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");

//forward跳转

dispatcher.forward(request, response);

}else{

response.sendRedirect("index.jsp?msg=fail");

}

}



UserService:

/**

 * 为Servlet提供服务的类

 */

public class UserService {


/**

* 判断登陆信息是否正确

* @param username

* @param password

* @return

*/

public static boolean check(String username,String password){

boolean r = false;

if(username != null && password != null && username.equals("管理员") && password.equals("123456")){

r = true;

}

return r;

}

}


checkLogin.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>

<%

   String username = (String)session.getAttribute("username");

   

   //判断如果没有登陆(session没有值,则跳转到登陆页面)

   if(username == null){

       response.sendRedirect("index.jsp?msg=notlogin");

   }

%>


main.jsp

    <%@ include file="checkLogin.jsp" %>

  

          欢迎<%=username %> 登陆!<br>


index.jsp

<p style="color:#F00">

 <%

    String msg = request.getParameter("msg");

    

    //如果有提示信息

    if(msg != null){

       //如果是登陆失败

       if(msg.equals("fail")){

          out.print("用户名或密码有误,请重新登陆!");

       }else if(msg.equals("notlogin")){

          out.print("您尚未登陆,请先登陆再访问!");

       }

    }

  %>

</p>



6、servlet的访问原理和生命周期

A、访问原理

通过Servlet在web.xml中的url-pattern节点的值访问!


通过url-pattern找到servlet-name,找到声明节点的servlet-name,找到声明节点的servlet-class


B、servlet的生命周期

构造方法、init():首次访问servlet时,调用构造方法构造对象,调用init方法做初始化的工作

service():后续访问时,不在生成新对象,而是用首次访问生成的对象,调用service方法判断是get还是post请求

doGet()、doPost():根据判断进入doGet或者doPost方法

destroy():项目重新发布,或者服务器关闭时,调用destroy方法销毁对象



例子:

public class TestServlet extends HttpServlet {


public TestServlet() {

System.out.println("Servlet构造方法被访问,创建对象!");

}


public void destroy() {

System.out.println("Servlet的销毁方法被访问!");

}


public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("doGet被访问!");

}


public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {


System.out.println("doPost被访问!");

}


public void init() throws ServletException {

System.out.println("Servlet被初始化!");

}

//帮助我们判断是get请求还是post请求,get请求调用doGet,post请求调用doPost

protected void service(HttpServletRequest arg0, HttpServletResponse arg1)

throws ServletException, IOException {

System.out.println("service被访问,判断是get请求还是post请求!");

super.service(arg0, arg1);

}


}


7、web.xml中定义欢迎页面

  <!-- 欢迎页面列表:顺序访问欢迎页面列表中的页面,只要有一个存在,就不向下看 -->

  <welcome-file-list>

    <welcome-file>index1.jsp</welcome-file>

    <welcome-file>login.jsp</welcome-file>

  </welcome-file-list>


8、错误页面

  <!-- 错误页面的配置 -->

  <error-page>

     <error-code>404</error-code>

     <location>/a.jsp</location>

  </error-page>

  

  <!-- 500 -->

  <error-page>

     <error-code>500</error-code>

     <location>/b.jsp</location>

  </error-page>


注意:错误页面一般是项目上线后才配置!


9、session超时时间的设置

session.setMaxInactiveInterval(10);//单位:秒


  <!-- session超时时间,单位:分钟 -->

  <session-config>

     <session-timeout>30</session-timeout>

  </session-config>

image.png

10、获取checkbox的值:String[] values = request.getParameterValues("");

例子:

index.jsp

<form action="login" method="post">


<p>

  选课科目:

  <input type="checkbox" name="subjects" value="A"/>语文

  <input type="checkbox" name="subjects" value="B"/>数学

  <input type="checkbox" name="subjects" value="C"/>英语

  <input type="checkbox" name="subjects" value="D"/>政治

</p>


<p>

<input type="submit" value="提交" />

<input type="reset" value="重置" />

</p>

</form>


LoginServlet:

/**

* 重写doPost

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//声明request编码,防止带来的参数乱码

request.setCharacterEncoding("utf-8");

//声明response编码集,防止向页面输出乱码

response.setContentType("text/html;charset=utf-8");

//获取checkbox的值

String[] subjects = request.getParameterValues("subjects");

//如果没有勾选,则得到null

if(subjects != null){

for(int i = 0;i < subjects.length;i++){

System.out.println(subjects[i]);

}

}else{

System.out.println("没有勾选!");

}

}

}


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn