Servlet + JSP

 

Servlet

是服务器端运行的java小程序,起到一个桥梁的作用,用于浏览器和应用程序之间进行沟通。

1. 常见的java服务器

tomcat(FREE apache)
jetty(FREE eclipse)
jboss (jboss)
weblogic (bea, oracle)
websphere (ibm)

 

2. 常用的服务器tomcat

目录结构
bin 可执行脚本目录
conf 配置文件目录 默认端口8080, server.xml 搜索8080 然后修改
logs 日志目录
webapps 应用程序目录

 

3. 启动和停止

前提条件: 1. 要安装jdk, 2. 要配置JAVA_HOME 环境变量

启动: bin/startup.bat (windows下)
停止: bin/shutdown.bat (windows下)
或者
在启动的黑窗口下 CTRL+C (停止程序,不是拷贝)

可以用浏览器检查它是否真正启动:
在浏览器地址栏输入 http://localhost:8080 当端口号为80时可以省略不写

 

4. 修改端口号

在conf/server.xml 文件中搜索8080 找到后修改为其它端口号即可

 

5. 在idea 里配置tomcat

 5.1  点击Run/Debug Configuration菜单:

                 按图中步骤依次选择DefaultsTomcat Server(Local)ConfigurationTomcat Home                                                                    在Tomcat Home中选中Tomcat的解压目录即可

                    

                    

5.2  再点击左上角+号添加本项目的Tomcat 运行

      以后用Shift+Alt+F10弹出菜单中选择要运行配置即可

                    

    

6. 编写第一个servlet

6.1首先新建一个 java Enterprise 项目 点击 Web Applicaton,next

6.2 编写一个Servlet

/**
 * 1. 继承 HttpServlet父类
 * 2. 使用注解 @WebServlet(urlPatterns = "浏览器访问路径")
 * 3. 覆盖父类中  service 方法
 */
@WebServlet(urlPatterns = "/hello")
public class MyServlet extends HttpServlet {

    @Override
    // Request : 代表请求
    // Response : 代表响应
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你好,世界");
        // 用servlet可以返回一段html代码,给浏览器

        // 对于中文,需要设置响应采用utf-8字符集,否则会使用英文字符集(iso-8859-1)返回响应,会有乱码问题
        resp.setContentType("text/html;charset=utf-8");

        // 向resp对象对象的字符输出流中写入的html代码都会返回给浏览器
        resp.getWriter().println("<html><body>你好,世界</body></html>");
    }
}

6.3 :写好代码后,通过Shift+Alt+F10弹出菜单启动tomcat,在浏览器地址栏输入http://localhost:8080/s1

 

7. 浏览器发送请求

语法:
http://ip地址:端口号/servlet地址?参数名1=参数值1&参数名2=参数值2...

?name=张三&pass=123 // name是参数名,张三是参数值, pass是参数名, 123 是参数值

服务器要获取请求参数:
String 请求参数的值 = request.getParameter("请求参数名");

注意:
如果某个参数没有传递,使用request.getParameter()返回的是null值
request.getParameter()返回的总是字符串,需要自己做数据类型转换

 

8. 请求类型

  1. get 请求 直接通过浏览器地址发送的请求
  2. post 请求
    表单form既可以发送get请求,也可以发送post请求
    区别: 1) get请求会把所有请求参数跟在地址栏之后,不适合发送敏感信息
                       而post请求不会把请求参数跟在地址栏之后
                2) 不要以为post请求是安全的,通过一些网络监测工具仍然可以看到post中的参数信息
                       http 是不安全的,都是明文发送给服务器的
                       https 是安全的,会把信息发送给服务器的过程中进行加密
                       https 和post结合可以保证向服务器传输数据的安全性
                3)   get请求传输的数据有限制, post请求没有限制(任意大小的数据都可以发送给服务器)
                4)   get 意味着获取信息(对应查询操作)
                      post 意味着增,改,删等操作

对于post请求,会有中文乱码问题,解决方法是调用:
// 手工进行解码, 需要放在所有 req.getParameter方法之前调用
req.setCharacterEncoding("utf-8");

注意: tomcat 8 已经对get请求中的中文按utf-8进行解码了, 所以程序员不需要对get请求的中文进行额外处理, tomcat 7, tomcat 6 ... 对get请求中的中文还需要特殊处理

 

 

9. servlet 的生命周期

整个生命周期中,servlet只有一个实例(单例的)

  1. 构造方法首先执行(只执行一次)
  2. 初始化方法init (只执行一次)
  3. 服务方法 service (反复被执行)来一次请求执行一次
  4. 销毁方法 destroy (只执行一次)在服务器停止前,或重新部署时

10. doGet与doPost

覆盖service方法,可以处理所有类型的请求
覆盖doGet方法,仅能处理get方式的请求
覆盖doPost方法,仅能处理post方式的请求

练习,把数据库中的数据展现在页面上

一个java web项目:
|-
     |-WEB-INF (受保护不能直接访问)
         |-classes 放自己编写的java类
             |-lib 放第三方的jar包
     |-css 放样式表
     |-js 放js脚本
     |-jsp 放网页文件
     |-index.jsp 首页面 如果没有写具体的地址,会按 index.html, index.jsp

注意:在一个项目内,多个servlet的urlPatterns不能重复,要确保唯一

使用serlvet生成html标签,代码难以维护,可读性差,容易出错。

jsp

java server page
用途:主要用来生成html标签

在表现形式上类似于html 但多了一行

<%@ page contentType="text/html;charset=utf-8" %>

上面的代码称为 page 指令,主要作用就是指明此页面是一个jsp页面,并且通过contentType说明他的字符编码和格式
jsp 中有

  1. 指令: <%@ 指令名 %>
  2. 脚本: <% 可以是任意java代码 %>
  3. 表达式: <%= 表达式 %> 把执行结果显示在页面上

1.  EL表达式语言

expression language 在jsp用来展示结果的语言
语法
${ 表达式语言 }

要用el表达式显示复杂的内容,需要把内容提前放入作用域, el再从作用域中把内容取出来显示
// 设置属性
pageContext.setAttribute("名称", Object); // 把内容起一个名字放入作用域

之后就可以通过EL表达式
${pageScope.名称}

el表达式可以通过
${对象.属性名} 但这里的属性名,依据是对象的get方法,而不是私有属性名
把get方法中get去掉(或把is方法的is去掉),剩余的单词首字母小写,作为对象的属性名,例如

getName() ==> name
getUsername() ==> username
getHelloWorld() ==> helloWorld
isClose() ==> close

2. JSTL

java 标准标签库
java standard tag library

主要的工具就是配合el表达式,实现循环,条件判断等功能
前提: 加入jstl-1.2的jar包
导入标签库
<%@ taglib uri="标签库唯一标识" prefix="前缀" %>

 常用:
  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

2.1 forEach

<c:forEach items="要遍历的集合" var="临时变量名" begin="起始数字" end="结束数字">
	${临时变量名}
</c:forEach>

要遍历的集合 必须使用${} 从作用域获取

2.2 if

<c:if test="布尔条件">内容</c:if>

2.3 choose
类似于 if else

<c:choose>
  <c:when test="条件1">内容1</c:when>
  <c:when test="条件2">内容2</c:when>
  ...
  <c:when test="条件n">内容n</c:when>
  <c:otherwise>以上条件都不成立时</c:otherwise>
</c:choose>

2.4 out
用来输出特殊内容
它可以对${}输出的内容进行控制,可以控制是否忽略html代码

<c:out escapeXML="false" value="${作用域变量}"> 不忽略html
<c:out escapeXML="true" value="${作用域变量}"> 忽略html,(当做普通文本)

2.5 formatDate
格式化日期

<fmt:formatDate value="日期对象" pattern="日期格式"/>

2.6 formatNumber
格式化数字
数字格式 `#` 和 `0` 其中0可以用来前置补零或后置补零

<fmt:formatNumber value="数字对象" pattern="数字格式"/>

 

3. MVC 思想

Model 模型 ==> 数据(例如从数据库查询出来的list集合, 里面包含java对象)
View 视图 ==> 数据的展现形式 (jsp就是一种视图技术)
Controller 控制器 ==> 把模型和视图联系起来 (servlet 充当控制器作用)

由servlet器查询数据,把数据放入作用域,跳转至jsp视图
jsp视图从作用域中获取数据,并展示

注意: 服务器常见的错误类型
500 Internal Server Error 服务器内部错误,由于应用程序自己没有正确处理异常,异常抛给了tomcat,这时就会出现500
404 Not Found 资源未找到错误,发生于要访问的资源不存在(资源可能是servlet, jsp, html)
405 Method Not Allowed 方法不支持,
当没有覆盖doGet但发送了get请求时
当没有覆盖doPost但发送了post请求时
200 OK 表示这次请求正常,没有错误
304 这个文件没有修改,请浏览器使用上一次缓存的文件

这些数字称为响应状态码

4. jsp表达式

作用是向页面显示值, 表达式不能以`;`结束

<%= 表达式 %>

 

5. jsp指令

<%@ page contentType="页面的内容类型和编码" 
	import="要导入的java类"
    isELIgnored="是否忽略EL表达式的处理" 
	errorPage="出现错误时,要跳转的页面"
	isErrorPage="用在错误页面上,取值为true表示是错误页面,这时候才能在页面中使用exception变量"
	%>

exception只能配合jsp表达式和jsp脚本使用

6. jsp声明

<%! 
	可以声明变量和方法
%>

jsp的原理:

//jsp 要工作,也必须编译为java类

public class 类名 extends HttpJspBase{ // HttpJspBase 又是继承了HttpServlet
	
	public int i = 100;
	
	public int sum(int a, int b) {
		return a+b;
	}
	
	public void _jspService(HttpServletRequest request,
		HttpServletResponse response) {
		int i = 10;
		
		out.println(i++);
	}
}
  1. 当首次访问此jsp时,tomcat会把jsp转译为*.java的类(间接继承自HttpServlet)
  2. 再把*.java类编译为*.class字节码
  3. 把加载到虚拟机执行,生命周期类似于servlet的生命周期

jsp的本质仍是一个servlet

 

7. 大隐式对象

无需声明即可使用

request             代表请求对象(可以获取请求参数,将变量存入request作用域)
response         代表响应对象(返回响应)
out                   代表响应的字符输出流
pageContext   页面上下文对象,可以间接获得request等对象,并可以将变量存入page作用域

config               jsp的配置信息
page                当前jsp对象(this)
exception         代表的是异常信息(当页面isErrorPage="true"时有效)

session            变量作用范围是一次会话内有效
application       变量作用范围是整个应用程序有效

page作用域:        变量作用范围仅限于当前页面
request作用域:     变量的作用范围在一次请求内有效
 

猜你喜欢

转载自blog.csdn.net/Wolves_7/article/details/82767142
今日推荐