admin 管理员组文章数量: 1087135
2024年1月15日发(作者:undergraduate形容词)
项目:ht为了防止tp:/和谐/请去掉m/share/汉字link?shareid=446316952&uk=672642110
2014年12月9日星期二(jfinal)
今天是第一天入职,学习jfinal
从表中可以看出, JFinal访问一个确切的Action(Action定义见3.2节)需要使用controllerKey与 method 来精确定位,当 method 省略时默认值为 index。urlPara 是为了能在 url 中携带参数值,urlPara 可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可通过 constants. setUrlParaSeparator(String)设置分隔符) ,在 Controller
中可以通过 getPara(int index)分别取出这些值。controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。
注意,controllerKey 自身也可以包含正斜杠“/” ,如“/admin/article” ,这样实质上实现了struts2的namespace功能。
记忆技巧: 第一个参数为 String 类型的将获取表单或 url 中问号挂参的域值。第一个参数为 int 或无参数的将获取 urlPara 中的参数值。
2014年12月10日星期三
1.注意打字质量,几次打错字而出错!
2.理清逻辑思路,居然出现没有配置
3.对陌生的质疑使我畏葸不前,要自信!
1.关于add
1.首先,页面是添加
2.到
3.到demonconfig
/**
* 配置路由
*/
public void configRoute(Routes me) {
}
("/", );
("/student", );
//("/classes", );
4.到StudentController的save方法
@Before()
public void save() {
}
Student student = getModel();
();
forwardAction("/student");
5.被StudentValidator拦截
protected void validate(Controller c) {
// 验证表单域name,返回信息key,返回信息value
validateRequiredString("tname",
"studentnameMsg", "请输入学生名册");
这里也可以用正则验证!validateRegex(field, regExpression, errorKey,
errorMessage)
}
6.反馈
7.转回/student,无参调用index()方法
@Before()
public void index() {
}
List
n(list);
setAttr("studentList", list);
render("/");
8.被StudentInterceptor拦截
public class StudentInterceptor implements Interceptor {
public void intercept(ActionInvocation ai) {
n("Before action invoking");
();
n("After action invoking");
}
}
9.执行后
render("/");
10.到index页面
<#list studentList as student>
#list>
2.关于delete
1.在页面传值
2.同添加一样,转到StudentController的delete方法
public void delete() {
}
//获取表单域名为studentID的值
//ById(getPara("studentID"));
//获取url请求中第一个值
ById(getParaToInt());
forwardAction("/student");
3.关于update
1.页面传值
2.同添加一样,转到StudentController的get方法
public void get() {
}
Student student = Id(getParaToInt());
setAttr("student", student);
render("/");
3.转到index2,提取修改的内容
4.提交到StudentController的update()方法
public void update() {
}
Student student = getModel();
();
forwardAction("/student");
4.设置view视图为JSP
public void configConstant(Constants me) {
Mode(true);
wType();
}
5.访问路径,同struts的命名空间
/**
* 配置路由
*/
public void configRoute(Routes me) {
}
("/", );
("/student", );
//("/classes", );
注解ActionKey(“/add”)将打破原有路由,可以直接访问/add,而不是/student/add
@ActionKey("/add")
public void add() {
}
render("/");
2014年12月11日星期四
使用jfinal放到tomcat运行出错!
pse中tomcat启动错误;原因是没有为tomcat配置JDK
2.在发布的项目里要写绝对路径,不然出现资源找不到错误
1.开始使用jfinal自带服务是这样的
2.删掉自带服务,放进tomcat后要配置路径
3.需要在config里配置上下文路径
public void configHandler(Handlers me) {
(new ContextPathHandler("contextPath"));//设置上下文路径
}
3.对映射路径的理解
在访问index()方法时,里面可以使用render系列方法,这时候就要考虑到路径的问题。上面这两条看的时候不注意,在项目实践中发现大有问题。加“/”表示绝对路径,就要写全以webroot为根的路径,“/”就是代表webroot,如果下面有个student文件夹,则访问student的里面的就要render(“/student/”);而第一列则表示相对所映射路径的位置,这个映射路径是在rout路由里面配置
public void configRoute(Routes me) {
}
n("这里进入到config路由");
("/", );
("/student", );
前面一个参数表示映射到的路径,这样添加映射的结果就是我可以直接访问该映射路径下的文件了,因此,我可以直接render(“”);注意:千万不要加”/”
4.页面列表显示
5.页面中重复元素提取
当页面出现重复的元素的时候,比如添加和修改有共同的部分
但要求要重新设置编码,设置为utf-8,设置长度和大小防止有人捣乱
6.更新出错
没有主键,应当如下设置
7.分页
1.后台是这样的
String sql = "from t_user order by id desc";
int pageNum = getParaToInt("pageNum", 1);//默认值是1
setAttr("pageNum", pageNum);
setAttr("objectlist",te(pageNum, 2, "select *",
render("");//即这里可省略
sql));
2.前台显示是这样的
<#list as user>
#list>
当前第${pageNum}页,总共:${ow}条,总共:${age}页
关键是这里,是因为分页又是一个list,再次取出来,
关于分页的源码来自/record/
修改后
<#list t() as user>
href="${contextPath}/user/delteById/${}">删除
href="${contextPath}/user/queryUserById/${}">修改
#list>
当前第${mber}页,总共:${ow}条,总共:${age}页
<#include "/common/_" />
<@paginate currentPage=mber
totalPage=age actionUrl="${contextPath}/user/" />
/**
* 查询所有
*/
public void index(){//假如页面和方法一致,默认跳到方法名为名称的页面
setAttr("userPage", te(getParaToInt(0, 1), 5));
}
private static final long serialVersionUID = 1L;
public static User dao = new User();
/**
* 所有 sql 写在 Model 或 Service 中,不要写在 Controller 中,养成好习惯,public class User extends Model
有利于大型项目的开发与维护
*/
}
public Page
}
return paginate(pageNumber, pageSize, "select *", "from t_user
order by id asc");
8.拦截器
全局拦截器
这个要配置在config里面
public void configInterceptor(Interceptors me) {
}
(new GlobalTestInterceptor());
llerInterceptor
@Before()
public class InterceptorController extends Controller{
Interceptor
@Before()
public void index(){
}
n("这是中间执行方法");
renderText("success");
4.拦截效果
5.清除拦截器
1)清除上一级
@ClearInterceptor//清除上一级拦截器(Controller级别)
public void destroyControllerInterceptor(){
}
n("这是清除上一级之后的");
renderText("successful");
清除效果
2)清除多级
@ClearInterceptor()//清除上一级拦截器(Controller级别)
public void destroyAllInterceptor(){
}
n("这是清除多级之后的");
renderText("successfully");
清除效果
6.拦截器栈
更高级的拦截,Handler
public void configHandler(Handlers me) {
(new FakeStaticHandler());
/**设置网站基本参数**/
(new EnterParaHandler());
/**设置访问监控**/
//(new VisitLogHandler());
}
当web请求发出后,Handler首先接管请求,然后才是拦截器。因此,可以在这里进行路径拦截设置。
9.事物
2014年12月12日星期五
tor校验器
1.在页面上的显示
用户名称:
value="${(me)!''}" maxlength="20"
size="50"/>${(userNameMsg)!'此字段不能为空'}
真实姓名:
value="${(me)!''}" maxlength="20"
size="50"/>${(realNameMsg)!'此字段不能为空'}
此字段不能为空---这是在开始的时候显示的内容,如果不写,则不显示内容,出错了显示
2.在后台拦截
/**
* 处理增加记录的方法
*/
@Before()
public void doAddUser(){
}
User user = getModel();//可以加一个参数取别名
("userpass", "123456");
boolean flag = ();
if(flag){
redirect("/user/");
renderText("Sorry,save failure");
}else{
}
3.进入校验器拦截
public class UserValidator extends Validator{
/**
* 错误处理
*/
protected void handleError(Controller c) {
String actionKey = getActionKey();
String view = null;
del();// 保存上一次提交时候的表单记录
if ("/user/doAddUser".equals(actionKey)) {
// 这个ActionKey表示添加记录 操作
view = "";
}
if ("/user/updateUser".equals(actionKey)) {
}
}
n("zhelisssssssss");
view = "";
(view);
/**
* 校验方法
*/
protected void validate(Controller c) {
/**
* 编写校验规则
*/
validateRequired("me", "userNameMsg", "用户名不能为空!!validateRequired("me", "realNameMsg", "真实姓名不能为
");
空!!");
}
}
在这里有这样的问题
视频里是1.4,里面加了trim(),而1.8去掉了:迪哥说可以再外面调用前就trim
2.上传文件
恶心了一下午,原来是没有导包1.前台表单
文件上传jfinal
2.后台处理
/** 处理文件上传 */
public void doUpload() {
UploadFile uf = getFile("filename","test/");
String title = getPara("title");//平时可以接到参数,但这里是null,要//接收文件上传的一个方法,放到test目录下如何获取带文件上传的表单的非文件元素数据
先getFile
renderText("upload successful");
}
3.设置文件目录(如果不设置,默认在tomcat部署的项目下的upload目录下,但会请空)
/** 配置常量 */
public void configConstant(Constants me) {
loadPropertyFile("a_little_");
Mode(getPropertyToBoolean("devMode", true));
wType(_MARKER);
oadedFileSaveDirectory("D:apache-tomcat-6.0.41apache}
-tomcat-6.0.41webappsjfinaldemo_upload");
版权声明:本文标题:jfinal学习笔记 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1705271154a479223.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论