JSP+Servet转发技术

JSP:

1.JSP的由来:

    在编写Servlet组件时,当涉及到HTML(CCS,JS)代码时我们需要使用大量的out.println() 进行输出,在开发与维护时比较占用开发周期。后来JSP就出现了,用来解决这一问题。

2.什么是JSP:

    Sun公司制定的一套服务端动态页面技术的规范。也就是使用.jsp文件封装了html,css,js,以及少量的java代码。
    当容器在处理请求时,如果访问的是jsp文件,那么容器会加载jsp对象到内存里然后jsp编译成.java文件,此时这个.java文件是一个符合servlet组件规范。最终会按照servlet组件运行下去。
    

3.JSP的语法:

    (1):JSP里可以写HTML,CSS,JS代码直接写即可
    (2):JSP还可以写java代码
        三种情况:
        ①:代码片段
            格式:<%    ...  %>
        ②:表达式
            格式:<%= ...  %>
            里面可以写java变量,计算式,有返回值的方法
        ③:声明
            格式:<%! ...  %>   生成的代码是在类底下

            里面可以类的属性,定义方法

    (3):指令:
        可以设置字符集,导包等
        常用指令
        <%@指令名称    属性=值%>
        eg:
        <%@page pageEncoding="utf-8"%>
        <%@page import="java.util.*"%>
        <%@page import="java.util.*,java.sql.*"%>
        
    (4):注释:
        <%--  --%>    
            注释内容会被容器解析出成纯文本
            浏览器不会解析出来
        <!--      -->

            此注释会被浏览器解析出来


案例一:通过编写a.jsp代码,在页面中循环输出HelloWorld

代码演示:

<%@page pageEncoding="utf-8" %>
<html>
	<head>
		<title>JSP1.0</title>
	</head>
	<body>
		<!-- 显示10行HelloWorld -->
		<% 	
			for(int i=0;i<10;i++){
		%>
				HelloWorld<br/>
		<% 
			}
		%>
	</body>
</html>


案例二:通过编写b.jsp代码,在页面实现JAVA表达式

代码演示:

<%@page pageEncoding="utf-8" %>
<html>
	<head>
		<title>JSP1.0</title>
	</head>
	<body>
		<!--  java 表达式-->
		<%= (5+6+7+8) %><br/>
		<%= Math.sqrt(25) %><br/>
	</body>
</html>


案例三:编写c.jsp在JSP中实现JAVA声明,定义一个参数求和方法

代码演示:

<%@page pageEncoding="utf-8" %>
<html>
	<head>
		<title>JSP1.0</title>
	</head>
	<body>	
		<!--java声明 练习:定义一个两个参数求和方法-->
		 <%!
		 	int sum;
			public int sum(int a, int b){
			 	sum = a+b;
			 	return sum;
			}
		 %>
		 <%=sum(6,5) %><br/>
		 <%=sum %><br/>
	</body>
</html>


案例四:编写data.jsp代码,实现按需要的格式打印日期时间

代码演示:

<%@page pageEncoding="utf-8" %>
<%@page import="java.util.Date" %>
<%@page import="java.text.SimpleDateFormat" %>
<html>
	<head>
		<title></title>
	</head>
	<body>
		当前时间:
		<%
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Date date = new Date();
			String str=sdf.format(date);
		%>
		<%= str%>
	</body>
</html>


Servlet的生命周期

1.概念
    即容器如何创建Servlet对象,如何给Servlet对象分配资源如何调用Servlet对象的方法进行请求处理,如何销毁Servlet对象的过程。
    阶段1:实例化(创建Servlet对象)
    两个时机:
        时机1:容器在接收到请求时,实例化Servlet对象。
        时机2:当容器启动时,立即实例化Servlet对象。
                   需要在web.xml文件中相应的servlet中配置
                   <load-on-startup>0</load-on-startup>数字越小,优先级越高
    阶段2:初始化
    (1):创建对象后,调用init方法进行初始化。                   
    (2):通常情况下,init方法不需要我们去手动添加,因为GenericServlet抽象类已经提供好了init方  法的实现:  会接受容器创建ServletConfig对象,将对象保存下来,提供了一个方法getServletConfig()获取对象。  
         如果继承过来的init方法不满足我们的需求时:
         比如:我们可以给自定义的一些属性进行赋值操作。   
         这时,我们可以调用ServletConfig对象的 getInitParameter(String name);
                   我们可以在web.xml中配置初始化参数的值。
                 <init-param>
                         <param-name>company</param-name>
                         <param-value>hyxy</param-value>
                 </init-param>
   (3):init方法只调用一次。  
    阶段3:就绪
       (1)容器会在收到请求后,调用Servlet对象的service方法进行请求处理。
       (2)容器会根据请求方法的不同而调用doGet或者doPost方法

              父类中的service中会根据请求方式来决定调用哪一个。
              所以,我们有两种选择:
              选择1:   覆盖doGet方法或者是doPost方法
              选择2:覆盖service方法   

    阶段4:销毁
    (1)容器会根据自己的算法来销毁servlet对象,销毁前 一定会调用destroy()方法 。
    (2)此方法也不需要手动提供,GenericServlet已经提供了destroy()方法的实现。 当然,如果你想 自定义一些逻辑时,可以覆盖此方法。
    (3)程序卸载时,一定会销毁Servlet对象。       
   
===========================================================

Servlet

    是sun公司开发的用于扩展web服务器的组件规范。
    组件:是一个能实现部分功能,需要部署在一定环境下才能运行的模块
    容器:可以运行组件的一个程序。
    
如何开发一个Servlet:
    1.编写符合规范的servlet组件
    2.引用第三方jar包,编译成.class文件
    3.需要打包成以下结构:
        appName
            --WEB-INF
                --web.xml
                --classes:存放class文件
                --lib:存放第三方jar包
    4.将打包的结构部署到tomcat中的webapps文件夹下。
    5.启动tomcat
        在浏览器上输入http://ip:port/appName/xxx.jsp
        
错误代码:servlet容器向浏览器返回的状态码
    404:访问路径不存在
        原因:appName写错,url写错,servlet-name写错
    405:方法不被允许使用
        原因:service方法名称不一致,方法内的参数类型不符合规范
            
http协议:
    w3c组织(万维网联盟)的一种通信协议,定义了浏览器与web应用之间的数据格式
    包含了请求和响应.
    请求:是浏览器向服务器发送数据
        请求数据包含:
            请求行:请求方法+请求路径+协议种类+版本
            消息头:都是以键值对的形式存储的
            实体内容:只有post请求才会有数据
    响应:是服务器向浏览器发送数据
        响应数据包含:
            状态行:协议种类+版本+状态码+状态信息
            消息头:以键值对的形式存储的
            响应数据:经过业务逻辑运算后要发送给浏览器的数据
    
Servlet如何处理http协议
    Servlet容器会将接收到的信息进行封装到HttpServletRequest这个类型的一个对象上
    我们就可以从request这个对象上获取我们想要的数据
    比如:获取版本号,参数,用户提价的数据,字符集等等
    
    Servlet容器在响应浏览器时,也会将一些数据封装到HttpServletResponse类型的一个对象上
    发送给浏览器后,浏览器会自动解析
    如:绑定消息头,字符集,状态码等等。
    
    注意:每一次请求与响应,Servlet容器都会创建request和response
    
参数的处理:
    请求对象的方法getParameter("");获取浏览器页面的value值,参数要传name属性的值返回字符串类型

请求方式:

    get请求方式(默认):提交的数据都会显示在地址栏上,可以提交数据的大小最多为4k。
    post请求方式:数据不显示在地址栏上,大小不限制,相对来说安全
        
        
处理中文乱码问题:
    服务端接收浏览器的数据时:
    get请求:
    服务端默认使用ISO-8859-1字符集
        String username = request.getParameter("");
        new String(username.getBytes("ISO-8859-1"),"UTF-8");
        此种方法也适合post请求,req.setCharacterEncoding("utf-8");
    post请求:
        req.setCharacterEncoding("utf-8");
        
    浏览器端接收服务端的数据
        使用response对象设置消息头
        resp.setContentType("text/html;charset=utf-8");

    
      

转发:

    当一个web组件要完成的功能逻辑,转交给另外一个web组件时此时,我们应该使用转发技术
    如:在查询所有员工信息时,servlet组件负责查询所有员工,显示功能交给jsp组件
怎么使用转发:
    1.绑定要处理的数据
        request.setAttribute(String name,Object obj)
        name:绑定名
        obj:要绑定的数据
    2.获取转发器对象
        RequestDispatcher rd = request.getRequestDispatcher(String url);    
        url:转发目的地的地址
    3.转发

        rd.forward(request,response)

       //获取数据
        Object obj = request.getAttribute(String name)


重定向:

     当一个web组件已经完成的功能逻辑,此时,如果需要页面跳转,应该使用重定向   

response.sendRedirect("findAll");


案例:模拟一个登陆页面,需要一个jsp页面让用户输入姓名和年龄,然后另外一个页面显示输出

步骤一:编写submit.jsp

代码演示:

<%@page pageEncoding="utf-8" %>
<html>
	<head>
		<meta charset="utf-8">
	</head>
	<body>
		<form action="Login" method="post">
			name:<input name="input_name"/><br/>
			age:<input name="input_age"/><br/>
			<input type="submit" value="提交"/>
		</form>
	</body>
</html>

步骤二:修改web.xml文件

代码演示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 
	<servlet>
		<servlet-name>login</servlet-name>
		<servlet-class>servlet.LoginServlet</servlet-class>
	</servlet>
 	<servlet-mapping>
		<servlet-name>login</servlet-name>
		<url-pattern>/Login</url-pattern>
	</servlet-mapping>
	
  <display-name>JSPPath02</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

步骤三:编写servlet组件

    1.需要继承HttpServlet父类

    2.重写service方法

代码演示:

package servlet;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("input_name");
		int age = Integer.valueOf(request.getParameter("input_age"));
		String person = "name:"+name+",age:"+age;
		//使用转发技术
		request.setAttribute("p", person);
		//相对路径
		RequestDispatcher rd = request.getRequestDispatcher("person.jsp");
		rd.forward(request,response);
		System.out.println("-------------------------");
	}
}

步骤四:编写person.jsp

代码演示:

<html>
	<head></head>
	<body>
		<%
			Object obj = request.getAttribute("p");
			String str = (String)obj;
		%>
		<p>welcome:<%=str %></p>
	</body>
</html>




猜你喜欢

转载自blog.csdn.net/qq_38741971/article/details/80774130