Servlet、JSP入门知识和新手学习过程中的总结『不断更新』

版权声明:本文为BUG先生原创文章,可任意转载,愿请附上本文链接,谢谢。 https://blog.csdn.net/Edogawa_Konan/article/details/81534794

目录

 一.Servlet

what is servle? 何谓Servlet Container?

『运作模式』servlet process flow

『servlet生命周期』the servlet life cycle

『原生servlet』PrimitiveServlet

『Servlet程序架构』Servlet program architecture

二.JSP

What’s Java Server Page

JSP Syntax『JSP语法』

Implicit Objects

(1).Request Object

(2).Response Object

(3).application Object

(4).Out Object

(5).Session Object

三.学习中遇到的一些基本问题

1.解决doPost调用doGet方法中文乱码问题

2.Spring Tool Suit 如何改变页面的编码方式(一般默认的时iso-8859-1改为utf-8)

3.PrintWriter out = response.getWriter(); 是什么意思?

4.jsp中的两种跳转方式分别是?有什么区别?

[1] 服务器端跳转:

[2] 客户端端跳转:

5.获取路径的几种方法

6.getAttribute和getParameter的区别

(1)、getParameter()方法

(2)、getAttribute()方法


 一.Servlet

what is servle? 何谓Servlet Container?

Servlet是浏览器引起程序在服务器上运行的一种技术,由服务器执行必要的计算,也许还需要访问数据库,最终把HTML输出返回给客户端上的浏览器。

Servlet Container就是能够执行Servlet的服务器,一般来说能够执行Servlet的服务器就能够执行JSP。

因为JSP --> servlet(.java) --> .class

      

『运作模式』servlet process flow

Servlet 是 server 端处理 client request 的 class,负责处理 request 的资料,可与 database 数据及其它 class 沟通,若干逻辑运算完毕后,再把结果 response 至 client。

『servlet生命周期』the servlet life cycle

『原生servlet』PrimitiveServlet

package com.icsc.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class PrimitiveServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
      System.out.println("init");
}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
     System.out.println("from service");
     PrintWriter out = response.getWriter();
     out.println("Hello.Roses are red.");
     out.print("Violets are blue.");
}
public void destroy() {
     System.out.println("destroy");
}
public String getServletInfo() {
     System.out.println("getServletInfo");
     return null;
}
public ServletConfig getServletConfig() {
    System.out.println("getServletConfig");
    return null;
}
}

『Servlet程序架构』Servlet program architecture

package com.icsc.servlet.web;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class helloWorldServlet extends HttpServlet {
  public void service(HttpServletRequest request, HttpServletResponse response) 
  		throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<H3>Hello World!</H3>");
	}
}


二.JSP

What’s Java Server Page

JSP Syntax『JSP语法』

<%  存放标准 Java 程序代码 %>
<%!变量、方法和类别宣告区(Declarations)%>
<%=输出表示式%>
        <%=foo%>在页面上显示变量foo的值 
<%--  批注区--%>
<%@ 编译指令  属性=“属性值”%>
     编译指令:page、include

(1).变量和方法的申明

<%! public static final String _AppId = "IS06"; %>
<%! // 转化数字格式
String formatNum(BigDecimal bg){
try {
   if(bg.compareTo(new BigDecimal(0)) > 0 )
      return new DecimalFormat("###,###,##0").format(bg);
   else
      return "" ;	
     }catch(Exception e){
      return "*";
     }
}		   
%>

(2).常用 Jsp 编译指令

<%@ page import=“java.io.*,java.sql.*” %>
import 其它的 package, 可以用 , 分开不同的 package , 或写 2 个 <%@ page import=“…” %>.

<%@ page contentType=“text/html; charset=GB2312” %>
设定目前本页的档案内容格式,及用何种编码. 

<%@ include file=“/erp/jsp/dzjjmenu.jsp” %>
引用其它的 jsp file ,在转成 servlet code 的时候,会把这 file 的内容也 include 进来,最后只会转成一个 servlet class.

Implicit Objects

隐含对象就是在Jsp中不需要事先做任何宣告就可以使的一些对象。每个隐含对象所用到类别、接口都被定义在Java Servlet API package中。

与servlet有关的隐含对象:page、config

与Input/output有关的隐含对象:out、request、response

Jsp执行时,提供有关Context的隐含对象:session、application、pageContext

与Error有关的隐含对象:exception

(1).Request Object

每支 Jsp 会自动产生 request 的object ,此 object 主要用作传递 client 的一些 information.

例如 : Server 处理 client 的资料(如会员登录)都是透过此 object 来取得资料。

<input type=“text” name=“myName” value=“InfoChamp”>, submit 送至 server 处理时,

处理的 Jsp 需要用 String aa = request.getParameter(“myName”)  ;  

getParameterNames()
回传窗体送出的字段名称,取得这些名称后自然也能取得对应的 value, 有时对 debug 蛮有帮助。

getParameterValues(String name)
取得相同名称的字段资料,所有结果会保存在一个 String[] 中。
 
getSession()
取得使用者的 session Object。 

setAttribute(String key, Object o)
可以把一些 object 暂时保存在 request 中。

getAttribute(String key)
取得以此 key 存在 request 中的 object

(2).Response Object

用来设定服务器端回应给客户端网页的状态。

//取得文件内容的编码方式
response.getCharacterEncoding();

//设定网页的文件格式与编码方式
方式1:<%@page contentType = “text/html; charset=UTF-8”%>
方式2:response.setContentType(“text/html; charset=UTF-8”);

//输出错误讯息到客户端
response.sendError(错误代码,文字讯息);

//将网页重新导向新网页
response.sendRedirect(“网页地址”);

(3).application Object

Application对服务器而言,可以视为一个所有上线者可共用的存取区,application的资料是程式设定其值时被初始化,当关闭网页伺服器或者超过预设时间而未有任何使用者连时自动消失。

建立application参数
		application.setAttribute(“参数名称”, “参数内容”)
传回application参数
		application.getAttribute(“参数名称”)
移除application参数
		application.removeAttribute(“参数名称”)
传回所有application参数
		application.getAttributeNames(“参数名称”)

(4).Out Object

每支 Jsp 会自动产生 out 的object - javax.servlet.jsp.JspWriter , 此object 主要用于把资料印在网页上 。

println(String content)
把资料印在网页上,虽然这来是 println ,实际要在网页中换行时还是要印一个 <br>

close()   
终止网页的印出,通常用在 debug 的时候。

flush() 
把目前存在暂存区中的资料全部印出,此 method 只有在 isAutoFlush() 为 false 时才有意义。 

(5).Session Object

(1).What Session

Session 是服务器端上线使用者的存取区,存放的是使用者的个别资料。

Session –交谈时期,在一段时间内 client 与 server 的互动作用。这段时间内,server 会保存 client的一些信息,并以一个 session id 作为辨认,在 client 写下一个 session id. 每当 server 收到 client 的 request 后,server 会以这 session id 在 server 上来寻找所有关于此 client 的信息。由于 client 的所有信息都是暂存在 server  的 memory中,会耗 server 的 resource. 所以 session 尽量不要使用太多。

当 client 连上 server 一段时间都没有再送出 request , server 就会把该笔 session 的信息清除。

每一个 Jsp file 都会自动产生一个叫 session 的object. 本身是属于 javax.servlet.http.HttpSession 的 class。


三.学习中遇到的一些基本问题

1.解决doPost调用doGet方法中文乱码问题

在doGet方法中添加【且一定要写在获取参数之前

//解决编码问题

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

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

2.Spring Tool Suit 如何改变页面的编码方式(一般默认的时iso-8859-1改为utf-8)

转载出处:https://blog.csdn.net/uniqueweimeijun/article/details/54879738

这个工具默认的编码是ISO-8859-1的西欧文字编码。为了设置成utf-8,还是折腾了一下。

总共设置了以下几个地方:

1、windows--preferences--general--workspace,Text file encoding设置成utf-8

2、windows--preferences--general--content types,把里面text的default encoding整个无脑update成utf-8

3、windows--preferences--web--jsp files,把这里的encoding设置成utf-8

3.PrintWriter out = response.getWriter(); 是什么意思?

//打个通俗的比方就是通过HttpServletResponse对象得到一支笔,

//然后就可以用out.print()方法在网页上写任何你想显示的内容。

4.jsp中的两种跳转方式分别是?有什么区别?

[1] 服务器端跳转:

(1).forward跳转:<jsp:forward page ="跳转页面地址">  //服务器端的跳转

  1. 服务器端跳转,地址栏不改变。url上的地址不变,说明是服务器端的跳转;
  2. 执行到跳转语句后马上执行跳转,之后的代码不再执行(跳转之前一定要释放全部资源)。
  3. request设置的属性在跳转后的页面仍然可以使用。

(2).request.getRequestDispatcher("ngLoad.jsp")

//举例:用于用户名密码错误提示

//在XX.java(servlet)上写:
request.setAttribute("message", "失败");
request.getRequestDispatcher("ngLoad.jsp").forward(request, response);

//在XX.jsp上写:
<%
    String message=(String)request.getAttribute("message");
    if (message == "失败") {
%>
    <p style="color:red; margin:0;padding:0;">用户名或密码错误</P>
<%
    }
%>

[2] 客户端端跳转:

response.sendRedirect("HelloWorld.jsp");     //客户端的跳转

   return;

一定注意:跳转之后该语句之后的代码会继续执行!!所以请加上return;

  1. 客户端跳转,地址栏改变。url上的地址变化,说明是客户端的跳转;
  2. 所有代码执行完毕后跳转。
  3. 跳转后页面不能使用上一个页面的request。
  4. 使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。

response.setHeader("refresh","1;URL=http://localhost:8080/Demozxj/Demozxj/load.html");//停留1秒

参考:JSP页面跳转的5种方式

5.获取路径的几种方法

${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> ,也就是取出部署的应用程序名或者是当前的项目名称。

比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp

${pageContext.request.contextPath}或<%=request.getContextPath()%>取出来的就是/demo1,而"/"代表的含义就是http://localhost:8080

故有时候项目中这样写${pageContext.request.contextPath}/a.jsp

//获取上下文路径
out.println("<h1>" + request.getContextPath() + "</h1>");
//获取绝对路径
out.println("<h5>" + request.getSession().getServletContext().getRealPath("/") + "</h5>");

举例:http://localhost:8080/app/testJsp.jsp

  <%=request.getContextPath()%>   获取项目的根路径         //app
  <%=request.getServletPath()%>   得到相对项目的url,不带项目名称 //testJsp.jsp
  <%=request.getRequestURI()%>    获取根路径到地址结尾     //app/testJsp.jsp
  <%=request.getRealPath("/")%>   工程文件的实际物理路径   //D:\sts_workspace\
  <%=request.getScheme() %>       返回当前页面使用的协议   //http 或是 https
  <%=request.getServerName()%>    返回当前页面所在的服务器主机的名字
  <%=request.getServerPort()%>    返回服务器接受此请求所用的端口号

其它:
1. getServletPath():获取能够与“url-pattern”中匹配的路径,注意是完全匹配的部分,*的部分不包括。 
2. getPageInfo():与getServletPath()获取的路径互补,能够得到的是“url-pattern”中*d的路径部分 
3. getContextPath():获取项目的根路径 
4. getRequestURI:获取根路径到地址结尾 
5. getRequestURL:获取请求的地址链接(浏览器中输入的地址) 
6. getServletContext().getRealPath(“/”):获取“/”在机器中的实际地址 
7. getScheme():获取的是使用的协议(http 或https) 
8. getProtocol():获取的是协议的名称(HTTP/1.11) 
9. getServerName():获取的是域名(xxx.com) 
10. getLocalName:获取到的是IP

6.getAttribute和getParameter的区别

(1)、getParameter()方法

  getParameter的中文意思就是获取参数,那么这个方法的作用就是用来获取参数的,它得到的是String类型。或者是用于读取提交的表单中的值,或是是某个表单提交过去的数据。getParameter()是获取POST/GET传递的参数值;它用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或url重定向传值时接收数据用。getParameter只是应用服务器在分析你送上来的request页面的文本时,取得你设在表单或url重定向时的值。  当两个web组件之间为链接关系时,被链接的组件同个getParameter方法来获得请求参数。例子如下:

String itemNoOrName=request.getParameter("itemNoOrName")==null ? "":request.getParameter("itemNoOrName");

(2)、getAttribute()方法

  它是一个函数。它只有一个参数。那个参数就是我们使用getElementById()或者使用getElementByTagName()方法取出来的节点元素的属性名称。取得属性的名称之后,我们就可以用getAttribute()方法将它的属性值拿出来了。例子如下:

例一:
<body>
    <p id="p1" customData="pmx">ppp</p>
    <script>
       var p = document.getElementById("p1");
       var pnode = p.getAttributeNode("customData");
       console.log(pnode)
    </script>
</body>


例二:
//在XX.java(servlet)上写:
request.setAttribute("message", "失败");
request.getRequestDispatcher("ngLoad.jsp").forward(request, response);

//在XX.jsp上写:
<%
    String message=(String)request.getAttribute("message");
    if (message == "失败") {
%>
    <p style="color:red; margin:0;padding:0;">用户名或密码错误</P>
<%
    }
%>

getAttribute和getParameter的区别如下:

    1、getAttribute是返回对象,getParameter返回字符串。

  2、request.getAttribute()方法返回request范围内存在的对象【当两个Web组件之间为转发关系时】,而request.getParameter()            方法是获取http提交过来的数据【 当两个Web组件之间为链接关系时,如:通过表单和链接传递的参数】。

  3、与getAttribute()方法对应的有setAttribute()方法,所以说必须先setAttribute设置属性,才能获得属性;

          但是没有与getParameter()相对的setParameter()。

猜你喜欢

转载自blog.csdn.net/Edogawa_Konan/article/details/81534794