JAVA web开发历史
早期的Java Web应用中,Jsp文件同时负责生产网页,控制到下一个网页的流程,以及负责业务逻辑,
这给web开发带来一系列问题:
HTML和Java耦合在一起,JSP文件的编写者必须是网页设计者,又是Java开发者。
缺点:
可读性差
调试困难
不利于维护,更改业务逻辑或者数据可能设计多个相关网页
现在通常分为四层:
表述层(JSP,HTML页面)
业务逻辑层(JavaBean)
持久化层(spring实现持久化)
数据库层
分层的优点:
可伸缩性
可维护性
可扩展性
可重用性
可管理性
分层的也体现了分而治之的思想。
web.xml中welcome 标签指定访问主页
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
JSP页面的pageEncoding和contentType两种属性的区别:
pageEncoding是jsp文件本身的编码
contentType的charset是指服务器发送给客户端时的内容编码
Struts2核心包
common-logging-1.0.4.jar Struts2框架的日志包
freemarker-2.3.8.jar Struts2的UI标签模板
ognl-2.6.11.jar 对象图导航语言包
strut2-core-2.0.11.jar Struts框架的核心类库
xwork-2.0.4.jar xwork类库,Struts2基于此构建
Struts 2的最终目的是将页面跳转以及模块处理进行解耦,可配置化。
STRUTS2的常见问题:
1. Tomcat 设置
Window->References->Tomcat
2.默认JDK设置,选中的JRE会被添加到新创建的JAVA 项目build path中
Window->References->Java->Installed JREs
3.项目名称太长
右击项目,copy qulified name
4.Struts 的常用配置步骤
1.web.xml配置 struts的filter 类
2.struts.xml 复制到 src 目录中。进行配置ACTION的页面跳转
3.lib 包复制到 WEB-INF\lib下
5. 配置在struts.xml中,当修改struts.xml文件后,不用重启Tomcat可以立马生效
<constant name="struts.devMode" value="true" />
6.如何在Eclipse中快捷的查看lib包的源码?
在Referenced Libraries中,右击lib包,选择Java Source Attachement,
C:/Users/anker/Desktop/Java学习/Struts2/struts-2.1.6-all/struts-2.1.6/src/core/src/main/java
7.设置 lib 包的 文档
在Referenced Libraries中,右击lib包,选择Java Location
file:/C:/Users/anker/Desktop/Java学习/Struts2/struts-2.1.6-all/struts-2.1.6/docs/struts2-core/apidocs/
8.问题:
Copy 项目后,当进行Tomcat部署时,报错此项目已存在。
解答:
需要修改上下文根,右击项目,选择Properties->MyEclipse->Web,修改 Web Context-root
9.Struts2配置简介
<package name="default" namespace="/path" extends="struts-default">
<action name="path" class="com.bjsxt.struts2.front.action.StudentAction">
<result name="SUCCESS">
/indexAction.jsp
</result>
</action>
</package>
package 主要用于解决action重名的问题
Namespace: 页面访问路径,等同于namespace=""或者namespace="/",意味着action标签,匹配所有其他namespace中未能匹配上的访问路径。
extends: 继承包
action:访问的模块处理,以后可跟.Action
class: 模块处理的实际类,若省略则访问Struts中的ActionSupport类,里面存在一个execute方法,返回success字符串。
result: 接受模块处理的返回处理
name: 根据返回的字符串访问jsp页面,若不填写,默认为"success"字符串。
global result配置:设置在当前namespace下,所有action公用的结果集
<global-results>
<result name="mainpage">login.jsp</result>
<global-results>
默认Action,当在当前包含的namespace中找不到匹配的action时,访问的action
<default-action-ref name="index"> </default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
模块包含 <include file="login.xml"/>,login.xml文件内容与struts.xml结构一致
10.Action类的实现三种方法
1.普通类,实现一个返回字符串的方法。
2.实现Action接口
3.从ActionSupport集成,好处在于可以直接使用Struts2封装好的方法。(推荐)
Action的类在访问时,对象即被Strut2框架自动创建出来。当用户每次访问时,产生的是不同的Action对象。
而在Struts1时,此对象只有一个。多个线程访问存在安全隐患。
11.Action类的方法调用
1.不指定方法,则默认访问Action类的Execute方法。
2.通过XX!method.action 进行调用,XX是Action模块,method是Action类中的方法
3.在Action 标签中,添加method= "add" 字符串,即访问此Action模块时,访问的是add方法。
12.Action类如何来接受参数?
1.通过URL进行传递。传递的参数在Action类当中需要定义对应的成员变量。
例如
http://localhost:8080/Struts2_0700_ActionAttrParamInput/path/path!GetMessage.action?name=Anker&age=18
这里访问的是path 对应的Action类下的GetMessage方法,并将Anker,18传递给Action类的成员变量name以及age
2.通过域模型接受参数(推荐)
即建立对应的实体类,此实体类包含相应的成员变量。并在Action类中实现此对象的get,set方法。
调用方式
http://localhost:8080/Struts2_0700_ActionAttrParamInput/path/path!GetMessage.action?user.name=Anker&user.age=18
备注:若是调用Action的过程中,没有对实体类的属性进行赋值,则不会创建实体对象。
3.ModelDriven 模型驱动
实现ModelDriven接口,通过getModel返回实体类的对象,对对象成员变量进行赋值。
13.如何在Struts.xml使用通配符
使用通配符,可以大大简化我们的配置。不过,一定要遵循"约定优于配置"的原则
在ActionName当中使用*号,后面的class,method或者result标签,可以使用{1}来配置第一个*号对应的字符串,
{2}配置第二个*号对应的字符串,以此类推
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_succes.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action">
<result>/{1}_{2}_success.jsp</result>
</action>
</package>
14.问题:如何解决页面的默认编码
解答:
Windows->Preferences-> JSP
Encoding 换位 Chinese , National Standard,这样默认建立出来的编码格式为GB18030。页面既可以写入中文。
15.JSP页面的绝对路径问题
struts2中的路径问题是根据action的路径而不是jsp路径来决定,所以尽量不要使用相对路径
由MyEclipse生成的jsp页面,生成的内容通常包括以下部分:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
path是获取当前项目的上下文根
basePath = http://localhost:端口号/项目上下文根/
在head标签中,加入<base href="<%=basePath%>">,即意味着页面的链接皆采用绝对路径
<head>
<base href="<%=basePath%>">
</head>
16. 在1.6版本,在实现接口时,会自动生成字符串@override。而这字符串在1.5不支持
JDK 1.6设置:
Installed JRE 设置为1.6
项目的Java Compiler Level 也要设置为1.6
Tomcat 6.x下面的JDK也设置为1.6
17.MVC 的概念
MVC 中的
M : Model 实体
C : Action
V: View 视图
由C 进行控制访问,将Model与View分开。
18.如何查看Tomcat的端口号?
%TOMCAT%下的/conf/server.xml文件:
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
19.Struts2访问 Web元素的方法
(request,session,application)
request < session < application
request: 只在一次请求上(转发不算请求,因为转发是服务器的行为)生效。
session: 当用户访问某个站点时,服务器端会为客户产生一个sessionID,以cookie的方式返回给客户端。一个
用户就好比一个session对象,直到关闭浏览器.
application: 一个服务器就是一个application对象,当服务器停止时候,application被摧毁。
对应的接口
request : javax.servlet.http.HttpServletRequest
session : javax.servlet.http.HttpSession
application : javax.servlet.ServletContext
共有的方法
setAttribute(String name, object o), getAttribute(String name)
在Struts2 框架中,如何获取request,session,application对象
1.利用ActionContext容器去获取,获取的类型为MAP类型
2.实现接口RequestAware,SessionAware,ApplicationAware,Struts框架自动通过set方法注入对象。对象类型为MAP<String,object>(推荐)
3.利用ServletActionContext容器获取,对象类型为HttpServletRequest,HttpSession,ServletContext。
4.实现接口ServletRequestAware接口,Struts框架自动通过set方法注入对象。对象类型为HttpServletRequest,HttpSession,ServletContext。
IOC与DI概念
IOC : Inverse Of Control的简写。控制反转,由框架配置进行控制对象的创建
DI : Dependency Injection,依赖框架将对象注入,而非自动去NEW或者获取
20.利用javaScript 实现一个页面多个按钮提交
<input type="button" value="submit1" onclick="javascript:document.f.action=‘login/login1.action‘;document.f.submit();">
<input type="button" value="submit2" onclick="javascript:document.f.action=‘login/login2.action‘;document.f.submit();">
<input type="button" value="submit3" onclick="javascript:document.f.action=‘login/login3.action‘;document.f.submit();">
<input type="button" value="submit4" onclick="javascript:document.f.action=‘login/login4.action‘;document.f.submit();">
21. 使用addFieldError方法和s:fieldError标签简单处理数据校验
数据校验后,添加错误
this.addFieldError("name", "name is error");
添加Struts标签
<%@taglib uri="/struts-tags" prefix="s" %>
将Action中添加进去的fielderror 取出来进行显示
<s:fielderror fieldName="name" theme="simple"/>
<s:debug> </s:debug>
Value Stack
值栈:中间存放着Property name 与 Property Value
栈就是个容器,后进先出,先进后出原则。
通过<s:property value="errors.name[0]"/> 对value Stacke中取值。
这里的errors是property name,
name是map类型集合的key,[0]是取集合数组值的第一个值。
22.如何快速打开编辑JSP页面?
右击jsp页面,选择open with,选择MyEclipse JSP Editor
23.ACTION接受中文参数时,中文乱码如何处理?
<constant name="struts.i18n.encoding" value="GBK"/>
struts 2.16存在bug,在struts.xml中设置此语句后,中文仍然存在乱码。在2.17版本后解决了此问题。
24.结果类型 result type
<result type="dispatcher" name="SUCCESS">/indexAction.jsp</result>
dispatcher(默认的,服务器跳转。等同于jsp的forward,只能跳转到jsp页面)
redirect (客户端跳转到jsp,无法共享value stack的内容。需要从action Context 中取值)
chain(跳转到action,跳转的类型为服务器跳转)
redirectAction(客户端跳转到action)
25.服务器跳转与客户端跳转的区别
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,
所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.。
26.OGNL表达式
访问值栈(value stack)中的action普通属性: <s:property value="username"/>
访问值栈中的对象普通属性(get,set方法): <s:property value="user.age"/>
通过<s:debug></s:debug>可以查看值栈里面的内容
当Action中对象的属性有赋值的时候,Struts才会自动由构造对象。否则不会创建。