struts的一些琐碎知识(一)

1.学习Java  Web应用开发,需要安装一个支持JSP、Servlet等技术的Web服务软件,这样的软件称为Web容器,而将安装Web容器的计算机称为Web服务器。支持JSP的Web容器负责运行JSP程序,并将结果以网页的形式返回给客户端。


2.如果Tomcat安装时选择“Full”完全安装,Tomcat服务器安装目录的webapps文件夹下包含docs、examples等目录,这些目录实际上也是Web服务目录,他们是Tomcat自带的Web项目设置的Web服务目录,例如访问http://localhost:8080/examples/,就可以访问本地Tomcat服务器上自带的JSP和Servlet例子。

事实上,在webapps目录下任何一个子目录都可以作为一个Web服务目录。假设在webapps目录下新建一个文件夹JSPTest,那么JSPTest也是一个Web目录,如果将JSP页面文件test.jsp保存至JSPTest目录下,那么用户在此Tomcat服务上使用如下URL即可访问test.jsp:http://localhost:8080/JSPTest/test.jsp.

当然也可以将其他目录作为Web服务目录,只需要设置此目录为虚拟目录即可。假设设置Tomcat服务器所在的计算机的D://WebPages目录设为虚拟目录,且虚拟目录名称为web,那么具体步骤为:

1:打开Tomcat安装目录/conf/server.xml;

2:修改<Host>元素。在server.xml中找到<Host>元素并为其增加<Context>子元素:<Context path="web" docBase='D:/WebPages" debug="0‘ reloadable="true"/>

3:保存并且重启Tomcat即可。


3.设置端口号

1:打开Tomcat安装目录/conf/server.xml;

2:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443'


4:简介Web项目下的文件

src:主要存放Java源文件,项目中的JavaBean、Servlet等java源文件

build:主要存放JSP编译之后的中间字节码文件

WebContent:主要存放Web资源,如JSP页面、HTML页面、图片、CSS等文件。WEB-INF子文件夹主要存放库文件(lib)JavaBean和Servlet编译之后生成的中间字节码文件(classes)和配置文件(web.xml),META-INF子文件夹包含一个文件MANIFEST.MF,主要用于jar打包。


5:JSP运行机制

JSP是如何运行的呢?以Hello.jsp为例,当客户想Tomcat服务器发送请求访问Hello.jsp页面时,Tomcat服务器将启动一个线程,该线首先将Hello.jsp转化成一个Servlet即Hello_jsp.java,然后再将此Servlet编译成中间字节码文件并加载运行。一旦该客户请求完成时,线程进入死亡状态,但是该中间字节码文件却一直长住在Tomcat服务器内存,直至Tomcat服务器终止运行。当又有客户端请求该页面时,Tomcat服务器将在启动一个线程,直接执行长住内存的中间字节码文件并将结果以HTML的形式响应客户。由此可见,仅仅当JSP页面第一次被请求是被编译,以后再次请求时将直接运行。

注:Hello_jsp.java将保存在Tomcat安装目录下的work文件夹内。


6:HTTP协议简介

1.无连接指的是每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。

2.无状态指的是对事务处理没有记忆功能。因为无连接即一旦处理完即断开连接,并不保存本次连接的任何信息,这就意味着如果后续处理需要前面的信息,他就必须重新传输。


7:HTML元素简介

1.DOCTYPE声明元素,即文档类型(Document Type)在页面中用来指定页面所使用的HTML(或者XHTML)版本。语法格式(即DTD);<!DOCTYPEHTML顶级元素可用性“注册//组织//类型标签//定义语言”“URL”


8:注释

1 HTML注释.<!-- -->在源代码中可以看到

2.JSP注释<%-- -->JSP引擎忽略JSP注释,用户在客户端看不到


9:JSP脚本元素

1.<%! %>表示声明

2.<%= %>表示表达式

3.<%   %>表示代码段

注意:使用<%! %>声明的变量和方法是页面级别的(相当于用static修饰),即他们在声明语句所在的页面有效。因为Tomcat将JSP页面转换为Java类时,声明的变量将作为类的成员变量,声明的方法作为类的方法。


10:使用<jsp:forward page="">动作标记跳转页面时,其URL并不会随之改变为跳转后的页面地址。


11:Request请求报文分为四部分请求行(Request Line)、请求首部(Request Header)、空行(Blank Line)、请求数据(Body)

请求行 GET /JSPRequest.jsp HTTP/1.1第一部分GET表示get请求,第二部分(/)表示请求的是该域名的根目录,最后一部分说明使用的是HTTP1.1版本

请求首部:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language:zh-CN,zh;q=0.8
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.802.30 Safari/535.1 SE 2.X MetaSr 1.0
Host:localhost:8080

Connection:keep-alive

下面是获取该内容的源码及其他:

<%=request.getMethod()%>
<%=request.getServletPath()%>
<%=request.getProtocol()%><br>
Accept:<%=request.getHeader("Accept") %>
Accept-Language:<%=request.getHeader("accept-language") %><br>
Accept-Encoding:<%=request.getHeader("accept-Encoding") %><br>
User-Agent:<%=request.getHeader("user-agent") %><br>
Host:<%=request.getHeader("host") %><br>
Connection:<%=request.getHeader("connection") %><br>
客户端请求的MIME类型:<%=request.getContentType() %><br>
request.getRequestURL:<%=request.getRequestURL() %><br>
request.getCharacterEncoding():<%=request.getCharacterEncoding() %><br>
name:<%=request.getAttribute("name") %><br>
枚举集合(包含request对象所有属性):request.getAttributeNames()<br>
HTTP请求长度:<%=request.getContentLength() %><br>
上下文路径(即当前Web应用的根目录):<%=request.getContextPath() %><br>
查询字符串:<%=request.getQueryString() %><br>
<%--getReader().nextLine() 怎么会说getReader()未定义呢--%>
<%-- <%String s =  new Scanner(request.getInputStream()).nextLine();%>
<%=s%> --%>
<%=request.getHeaderNames()%><br>
客户端地址:<%=request.getRemoteAddr()%><br>
客户端主机名:<%=request.getRemoteHost() %><br>
客户端请求的端口号:<%=request.getRemotePort() %><br>
请求协议名称:<%=request.getScheme() %><br>
服务器名称:<%=request.getServerName() %><br>
服务器端口号:<%=request.getServerPort() %><br>
获得请求JSP页面的名称:<%=request.getServletPath() %><br>
空行是非常重要的,它是用来分隔首部和数据的标志。

使用request内置对象的诸多方法能够获取客户端集服务器的运行环境,还可以利用getParameter()方法、setAttribute()等方法、getAttribute()等方法实现两个页面见传递数据。


12:设置和获取Cookie

<%
Cookie c1 = new Cookie("name","java");
Cookie c2 = new Cookie("password","123");

c1.setMaxAge(180);//秒
c2.setMaxAge(180);//秒

response.addCookie(c1);
response.addCookie(c2);
%>
PrintWriter pw = response.getWriter();
for(Cookie tem : request.getCookies()){
	pw.print(tem.getName()+tem.getValue());
}


13:page对象代表当前正在运行的JSP页面,或者可以认为page代表的是JSP页面被编译后的Servlet,因此类似Java语言中的this关键字。需要注意的是page对象只能在当前JSP页面范围内使用。

方法	说明
Class getClass()	获取page对象的类
int hashCode()	获取page对象的hash码
boolean equals(Object obj)	判断此对象是否与obj相等
String toString()、void copy(Object obj)、Object clone()、void notify()、void notifyall()	
void wait()、void wait(int timeout)、void enterMonitor()、void exitMonitor()	
加锁和解锁


本页面对应的Servlet为:<%=page.getClass() %><br>
本页面对应的Servlet的hash码为:<%=page.hashCode() %><br>

14:Servlet与传统的以命令行方式启动的Java应用程序不同,Servlet由包含Java虚拟机的Web服务器进行加载并运行。Filter可以实现对Servlet的过滤,Listener实现监听。


15:JavaBean能够实现JSP与java代码的传值

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    import="soft.app.one.bean.*"                                                                                 -->导入JavaBean所在包名
    %>
<!-- 使用jsp:useBean声明一个JavaBean对象,这样在指定范围内就可以调用该 JavaBean -->
<jsp:useBean id="rectangle" class="soft.app.one.bean.Rectangle" scope="session" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<FORM action="" method="post">
<!-- 使用jsp:setProperty为指定的javabean对象的属性赋值  -->
<!--
<jsp:setProperty property="width" name="rectangle" value="100"/>
<jsp:setProperty property="length" name="rectangle" value="200"/>
-->
<!-- *表示自动匹配,它将<input>标签中name属性值同名的javabean属性匹配,并为之赋值  -->
<jsp:setProperty property="*" name="rectangle"/>
width: <input type="text" name="width" /> <br />
length:<input type="text" name="length" /><br />
<input type="submit" value="计算" />

</FORM>

<br/>
矩形的长为:<jsp:getProperty property="length" name="rectangle"/>;宽为:<jsp:getProperty property="width" name="rectangle"/>
<br/>

<jsp:getProperty property="calculate" name="rectangle" />

</body>
</html>

package soft.app.one.bean;

public class Rectangle {
	//JavaBean的属性可以没有setter方法,但必须要有getter方法
	private double length;
	private double width;
	
	private String calculate;
	
	public Rectangle() {
		
	}

	public Rectangle(double length, double width) {
		super();
		this.length = length;
		this.width = width;
	}

	public double getLength() {
		return length;
	}

	public void setLength(double length) {
		this.length = length;
	}

	public double getWidth() {
		return width;
	}

	public void setWidth(double width) {
		this.width = width;
	}
	
	public String getCalculate()
	{

		
		calculate = "面积为:" + (this.length * this.width) + ", 周长为:" 
		+ (this.length + this.width) * 2;
		return calculate;
		
	}
}

16:MVC与DAO的引言:
使用JavaBean可以实现表示层(JSP)与业务逻辑层(如15中的getCalculate()方法)的分离(即不在JSP中插入Java代码)。在一些小的项目中使用JSP+JavaBean(JavaBean既负责数据的传递又负责数据的处理)就可以了,但当Web应用复杂是就力不从心了,比如JavaBean实现页面的重定向比较困难。因此,把数据交给Servlet对象完成,即Servlet控制处理数据,JavaBean储存Servlet处理数据的结果,而JSP负责将JavaBean中存储的数据显示出来,这种模式就是MVC(Model-View-Controller)。
但是如果程序更大,所有的业务逻辑如访问数据库、数据操作和计算都交给Servlet处理,曲艺将导致Servlet非常臃肿并且如果业务流程发生改变,就必须修改整个应用系统,程序缺乏灵活性和稳定性。为例降低数据访问模块间的耦合度,提高程序的灵活性,人们又提出来DAO模式(Data Access Object)。












  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值