Struts2 基础知识

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/
选中查看的类,按F1可查看帮助文档

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"/>
<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" οnclick="javascript:document.f.action='login/login1.action';document.f.submit();">
<input type="button" value="submit2" οnclick="javascript:document.f.action='login/login2.action';document.f.submit();">
<input type="button" value="submit3" οnclick="javascript:document.f.action='login/login3.action';document.f.submit();">
<input type="button" value="submit4" οnclick="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表达式

OGNL表达式是围绕OGNL上下文来进行的,
OGNL上下文具有一个根对象, 访问根对象可以直接用名称或者属性名访问,而不需要加任何符号。
Struts2中将ActionContext作为OGNL上下文,并且将值栈作为OGNL上下文的跟对象,
通过Struts2的标签,直接使用OGNL表达式来访问ActionContext中的对象或者属性。
 
OGNL表达式中有三种符号,分别是#、%和$,但是常用的也就是#符号,%和$两种并不常用,只是在特殊情况下会使用。

1.取根元素的值(访问值栈中的对象普通属性get,set方法.
  当Action中对象的属性有赋值的时候,Struts才会自动由构造对象。否则不会创建。
  <s:property value="user.id"/>
  <s:property value="user.name"/>

2.取非根元素(需要增加#)
  <s:property value="#request.cn"/>
  <s:property value="#request.request_data"/>
  <s:property value="#session.session_data"/>
  <s:property value="#application.application_data"/>
  
//attr按顺序自动找request/session/application,找到后立刻返回
  <s:property value="#attr.application_data"/>
3.%符号,%符号是在标志的属性为字符串类型时,计算OGNL表达式的值
<s:a action="department_delete?id=%{id}&parentId=%{parent.id}" οnclick="return window.confirm('这将删除所有的下级部门,您确定要删除吗?')">删除</s:a>  
这就是将id放到url中,作为id参数的值。

27.struts2 exception的处理方法

在处理异常时,通过throws抛出异常,最后由struts.xml文件配置的错误页面来显示错误

<exception-mapping result="error" exception="java.lang.Exception"/>
通过会考虑使用global的方式,统一制定错误页面,其他package继承

<package name="bbs2009-default" extends="struts-default">
  <global-results>
     <result name="error">/error.jsp</result>
  </global-results>
  <global-exception-mappings>
     <exception-mapping result="error" exception="java.lang.Exception" />
  </global-exception-mappings>
</package>

28.EL表达式
EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:
${searchScope.user.sex}
所有EL都是以${为起始、以}为结尾的.上述EL范例的意思是:从Session的范围中,取得用户的性别。
EL 提供 . 和 [] 两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}等于${sessionScope.user["sex"]}
但要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ]


EL 存取变量数据的方法很简单,我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,
再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,
但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL

属性范围(jstl名称)
EL中的名称
Page|PageScope
Request|RequestScope
Session|SessionScope
Application|ApplicationScope

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值