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/

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" ο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表达式

访问值栈(value stack)中的action普通属性: <s:property value="username"/>
访问值栈中的对象普通属性(get,set方法): <s:property value="user.age"/>

通过<s:debug></s:debug>可以查看值栈里面的内容

当Action中对象的属性有赋值的时候,Struts才会自动由构造对象。否则不会创建。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值